Oracle数据库字符集的查询
- 格式:docx
- 大小:44.97 KB
- 文档页数:3
ORACLE修改数据库的字符集编码为UTF-81、查看数据库字符集?数据库服务器字符集:select * from nls_database_parameters,其来源于props$,是表⽰数据库的字符集。
客户端字符集环境:select * from nls_instance_parameters,其来源于v$parameter,表⽰客户端的字符集的设置,可能是参数⽂件,环境变量或者是注册表会话字符集环境select * from nls_session_parameters,其来源于v$nls_parameters,表⽰会话⾃⼰的设置,可能是会话的环境变量或者是alter session完成,如果会话没有特殊的设置,将与nls_instance_parameters⼀致。
客户端的字符集要求与服务器⼀致,才能正确显⽰数据库的⾮Ascii字符。
如果多个设置存在的时候,alter session>环境变量>注册表>参数⽂件字符集要求⼀致,但是语⾔设置却可以不同,语⾔设置建议⽤英⽂。
如字符集是zhs16gbk,则nls_lang可以是American_America.zhs16gbk。
2、修改Oracle的字符集,如下例把字符集GB2312修改为UTF-8 步骤: 1.在SQL*PLUS 中,以DBA登录 conn ⽤户名 as sysdba 2.执⾏转换语句: SHUTDOWN IMMEDIATE; STARTUP MOUNT EXCLUSIVE; ALTER SYSTEM ENABLE RESTRICTED SESSION; ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; ALTER SYSTEM SET AQ_TM_PROCESSES=0; ALTER DATABASE OPEN; ALTER DATABASE NATIONAL CHARACTER SET UTF8; SHUTDOWN IMMEDIATE; STARTUP;注意:如果没有⼤对象,在使⽤过程中进⾏语⾔转换没有什么影响,(切记设定的字符集必须是ORACLE⽀持,不然不能start)按上⾯的做法就可以,但是可能会出现ORA-12717: Cannot ALTER DATABASE NATIONAL CHARACTER SET when NCLOB data existsORA-12717: 存在 NCLOB, NCHAR 或 NVARCHAR2 数据时, 不能发出 ALTER DATABASENATIONAL CHARACTER SET 命令这样的提⽰信息要解决这个问题有两种⽅法⼀个是,利⽤INTERNAL_USE 关键字修改区域设置,还有⼀个是利⽤re-create,但是re-create有点复杂,所以请⽤internal_use, SHUTDOWN IMMEDIATE; STARTUP MOUNT EXCLUSIVE; ALTER SYSTEM ENABLE RESTRICTED SESSION; ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; ALTER SYSTEM SET AQ_TM_PROCESSES=0; ALTER DATABASE OPEN; ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE UTF8; SHUTDOWN IMMEDIATE; STARTUP;如果按上⾯的做法做,National charset的区域设置就没有问题。
Oracle查看数据库字符集和客户端字符集SQL语句
Oracle 数据库分为数据库字符集和客户端字符集两种!
很多刚接触的朋友经常会搞混这两个字符集,数据库字符集是在创建数据库时进行指定的,不建议更改!而客户端字符集是可以随时更改的!
查询数据库字符集:
select * from nls_database_parameters t where t.parameter i n ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');
查询客户端字符集:
SELECT USERENV('language') FROM DUAL;
如何修改客户端字符集?
Windows:
set NLS_LANG=american_america.AL32UTF8set NLS_LANG =SIMPLIFIED CHINESE_CHINA.ZHS16GBK
Linux:
export NLS_LANG=american_america.AL32UTF8export NLS_ LANG="SIMPLIFIED CHINESE_CHINA".ZHS16GBK
以上为常用客户端字符集,一个是英文,一个是中文!
本次分享到此结束啦~
如果觉得文章对你有帮助,点赞、收藏、关注、评论,一键四连支持,你的支持就是我创作最大的动力。
Oracle查看字符集1.查看字符集1⼀、oracle服务端字符集2 SQL> select userenv('language') from dual ;34 USERENV('LANGUAGE')5 ----------------------------------------------------6 AMERICAN_AMERICA.ZHS16GBK789⼆、oracle客户段字符集10112.1 window环境下,修改注册表ORACLE_HOME⽬录下的环境变量NLS_LANG。
12132.2 unix/linux环境下,就是环境变量$NLS_LANG1415 [oracle@wang ~]$ echo $NLS_LANG16 AMERICAN_AMERICA.ZHS16GBK1718查看数据库字符集1920数据库服务器字符集select * from nls_database_parameters;,其来源于props$,是表⽰数据库的字符集。
2122 客户端字符集环境select * from nls_instance_parameters;,其来源于v$parameter,表⽰客户端的字符集的设置,可能是参数⽂件,环境变量或者是注册表23 24如何查询dmp⽂件的字符集2526⽤oracle的exp⼯具导出的dmp⽂件也包含了字符集信息,dmp⽂件的第2和第3个字节记录了dmp⽂件的字符集。
如果dmp⽂件不⼤,⽐如只有⼏M或⼏⼗M,可以⽤UltraEdit打开(16进制⽅式),看第2第3个字节的内容,如0354,然后⽤以下SQL查2728 SQL> select nls_charset_name(to_number('0354','xxxx')) from dual;2930 ZHS16GBK3132如果dmp⽂件很⼤,⽐如有2G以上(这也是最常见的情况),⽤⽂本编辑器打开很慢或者完全打不开,可以⽤以下命令(在unix主机上):33cat exp.dmp |od -x|head -1|awk'{print $2 $3}'|cut -c 3-634然后⽤上述SQL也可以得到它对应的字符集2.od 命令解释#od命令功能说明:输出⽂件内容。
怎么查看数据库的字符集和排列规则要查看数据库的字符集和排序规则,可以使用不同的方法,下面将介绍如何在常见的几种数据库中进行操作。
一、MySQL数据库MySQL是一个开源的关系型数据库管理系统,常用于Web应用程序的后台数据存储。
要查看MySQL数据库的字符集和排序规则,可以按照以下步骤进行操作:1.登录MySQL数据库。
打开命令行窗口或使用MySQL客户端工具,输入正确的用户名和密码进行登录。
2.查看数据库的字符集。
在MySQL命令行或客户端工具中,输入以下命令:```SHOW VARIABLES LIKE 'character_set_database';```这条命令将显示当前数据库的字符集。
3.查看数据库的排序规则。
在MySQL命令行或客户端工具中,输入以下命令:```SHOW VARIABLES LIKE 'collation_database';```这条命令将显示当前数据库的排序规则。
二、Oracle数据库Oracle是一种在大型企业环境中广泛使用的关系型数据库管理系统。
要查看Oracle数据库的字符集和排序规则,可以按照以下步骤进行操作:1.登录Oracle数据库。
打开命令行窗口或使用SQL*Plus等Oracle客户端工具,输入正确的用户名和密码进行登录。
2.运行以下SQL查询语句:```SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER IN ('NLS_CHARACTERSET', 'NLS_SORT');```这条查询语句将显示数据库的字符集和排序规则。
三、SQL Server数据库SQL Server是由Microsoft开发的关系型数据库管理系统,在Windows操作系统上广泛使用。
要查看SQL Server数据库的字符集和排序规则,可以按照以下步骤进行操作:1.登录SQL Server数据库。
oracle数据库字符集Oracle字符集的基本原理1. Oracle服务器字符集oracle以哪种字符编码存储字符,可以通过以下语句查出数据库字符集的设置。
⽅法1SQL> select * from v$nls_parameters where parameter='NLS_CHARACTERSET';PARAMETER VALUE---------------------------------------------------------------- ----------------------------------------------------------------NLS_CHARACTERSET AL32UTF8⽅法2SQL> select userenv('language') from dual;USERENV('LANGUAGE')----------------------------------------------------AMERICAN_AMERICA.AL32UTF82. 客户端操作系统字符集Windows,可以使⽤chcp命令获得代码页(code page)C:\Users\zy>chcp活动代码页: 936到微软的官⽅⽂档《》找到其对应的字符集Linux,字符集在/etc/sysconfig/i18n设置:LANG="zh_CN.GB2312" (指定当前操作系统的字符集)SUPPORTED="zh_CN.GB2312"(指定当前操作系统⽀持的字符集)SYSFONT="lat0-sun16"(指定当前操作系统的字体)3.客户端NLS_LANG参数:该参数⽤于向Oracle指⽰客户端操作系统字符集它的格式如下: NLS_LANG = language_territory.charset它有三个组成部分(语⾔、地域和字符集),每个成分控制了NLS⼦集的特性。
oracle字段类型查询语句Oracle是一种关系型数据库管理系统,它提供了多种字段类型来存储和处理不同类型的数据。
根据数据的特点和应用需求,我们可以选择合适的字段类型来创建数据库表。
在Oracle中,常见的字段类型包括数值型、字符型、日期型、大对象型和布尔型等。
下面将分别介绍这些字段类型的特点和查询语句。
1. 数值型字段类型Oracle提供了多种数值型字段类型,如整数型、浮点型、小数型等。
常用的数值型字段类型有NUMBER、INTEGER、FLOAT和DECIMAL等。
查询语句示例:创建一个存储整数的字段CREATE TABLE demo (id NUMBER(10));创建一个存储带小数的字段CREATE TABLE demo (price DECIMAL(10, 2));2. 字符型字段类型字符型字段类型用于存储文本数据,如姓名、地址等。
Oracle提供了多种字符型字段类型,如CHAR、VARCHAR2、CLOB等。
查询语句示例:创建一个存储固定长度字符串的字段CREATE TABLE demo (name CHAR(20));创建一个存储可变长度字符串的字段CREATE TABLE demo (comment VARCHAR2(200));3. 日期型字段类型日期型字段类型用于存储日期和时间数据。
Oracle提供了DATE和TIMESTAMP等日期型字段类型。
查询语句示例:创建一个存储日期的字段CREATE TABLE demo (birth_date DATE);创建一个存储日期和时间的字段CREATE TABLE demo (creation_time TIMESTAMP);4. 大对象型字段类型大对象型字段类型用于存储大量的文本数据或二进制数据。
Oracle提供了CLOB和BLOB等大对象型字段类型。
查询语句示例:创建一个存储大文本数据的字段CREATE TABLE demo (description CLOB);创建一个存储大二进制数据的字段CREATE TABLE demo (image BLOB);5. 布尔型字段类型布尔型字段类型用于存储真/假或开/关等逻辑值。
Oracle数据库字符集的查询Oracle数据库字符集通俗的讲就是一个字节数据的相关的解释的符号集合,它具有大小的差异,也有互相包容关系。
Oracle是支持国家语言的相关体系结构,它允许你使用本地化语言来存储,处理,检索数据。
它使数据库工具,错误消息,排序次序,日期,时间,货币,数字,和日历自动适应本地化语言和平台。
影响oracle数据库字符集最重要的参数是NLS_LANG参数。
它的格式如下:NLS_LANG = language_territory.charset 它有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。
其中:Language 指定服务器消息的语言,territory 指定服务器的日期和数字格式,charset指定字符集。
如:AMERICAN _ AMERICA. ZHS16GBK。
从NLS_LANG的组成我们可以看出,真正影响Oracle数据库字符集的其实是第三部分。
所以两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据,前面影响的只是提示信息是中文还是英文。
如何查询Oracle的字符集很多人都碰到过因为字符集不同而使数据导入失败的情况。
这涉及三方面的字符集,一是Oracel server端的字符集,二是oracle client端的字符集;三是dmp文件的字符集。
在做数据导入的时候,需要这三个字符集都一致才能正确导入。
1、查询Oracle Server端的字符集:有很多种方法可以查出oracle server端的字符集,比较直观的查询方法是以下这种:SQL>select userenv(‘language’) from dual; 结果类似如下:AMERICAN _ AMERICA. ZHS16GBK。
2、如何查询dmp文件的字符集:用Oracle的exp工具导出的dmp文件也包含了字符集信息,dmp文件的第2 和第3个字节记录了dmp文件的字符集。
怎么样查看数据库字符集
数据库服务器字符集select * from nls_database_parameters,其来源于props$,是表⽰数据库的字符集。
客户端字符集环境select * from nls_instance_parameters,其来源于v$parameter,
表⽰客户端的字符集的设置,可能是参数⽂件,环境变量或者是注册表
会话字符集环境 select * from nls_session_parameters,其来源于v$nls_parameters,表⽰会话⾃⼰的设置,可能是会话的环境变量或者是alter session完成,如果会话没有特殊的设置,将与nls_instance_parameters⼀致。
客户端的字符集要求与服务器⼀致,才能正确显⽰数据库的⾮Ascii字符。
如果多个设置存在的时候,alter session>环境变量>注册表>参数⽂件
字符集要求⼀致,但是语⾔设置却可以不同,语⾔设置建议⽤英⽂。
如字符集是zhs16gbk,则nls_lang可以是American_America.zhs16gbk。
Oracle导出导入与字符集信息查看Oracle导出/导入与字符集信息查看进行数据的导入导出时,我们要注意关于字符集的问题。
在EXP/IMP过程中我们需要注意四个字符集的参数:导出端的客户端字符集,导出端数据库字符集,导入端的客户端字符集,导入端数据库字符集。
我们首先需要查看这四个字符集参数。
查看数据库的字符集的信息:SQL> select * from nls_database_parameters;PARAMETER VALUE------------------------------ --------------------------------------------------------------------------------NLS_LANGUAGE AMERICANNLS_TERRITORY AMERICANLS_CURRENCY $NLS_ISO_CURRENCY AMERICANLS_NUMERIC_CHARACTERS .,NLS_CHARACTERSET ZHS16GBKNLS_CALENDAR GREGORIANNLS_DATE_FORMAT DD-MON-RRNLS_DATE_LANGUAGE AMERICANNLS_SORT BINARYNLS_TIME_FORMAT HH.MI.SSXFF AMNLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AMNLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZH:TZM NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZH:TZMNLS_DUAL_CURRENCY $NLS_COMP BINARYNLS_NCHAR_CHARACTERSET ZHS16GBKNLS_RDBMS_VERSION 8.1.7.4.1NLS_CHARACTERSET:ZHS16GBK是当前数据库的字符集。
selectuserenv('language') from dual;SELECT * FROM PROPS$;NLS_CHARACTERSET AL32UTF8对于简体中文平台,缺省的字符集是:ZHS16GBK常见的中文字符集有:ZHS16CGB231280 CGB2312-80 16-bit Simplified Chinese MB, ASCII ZHS16GBK GBK 16-bit Simplified Chinese MB, ASCII, UDC其中GB2312码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集--基本集》,由国家标准总局发布,1981年5月1日实施,通行于大陆。
新加坡等地也使用此编码。
GBK编码是1995年12月颁布的指导性规范。
GBK与国家标准GB 2312-80 信息处理交换码所对应的、事实上的内码标准兼容;同时,在字汇一级支持ISO/IEC 10646-1 和GB 13000-1 的全部中日韩(CJK) 汉字(20902字)。
包含了更多的编码。
但是我们说,ZHS16GBK 并非是ZHS16CGB231280的严格超集(虽然后者的汉字在前者中都存在,但是同样的编码在不同两个字符集中可能表达不同的汉字),所以在做数据库字符转换时仍然需要特别注意。
Oracle的字符集命名遵循以下命名规则:<Language><bit size><encoding>即: <语言><比特位数><编码>比如: ZHS · 16·GBK需要说明的是,有些字符集命名违背了这个规范,Oracle8/Oralce8i中的UTF-8是第一个打破这个命名规范的字符集。
我们可以看到一类字符集以AL开头,如:AL16UTF16其中AL代表ALL,指适用于所有语言(All Languages),按照这个标准当年UTF-8本应被命名为AL24UTF8。
查询数据库字符集的sql语句查询数据库字符集是数据库管理中的一项重要任务,通过查询数据库字符集,可以了解数据库所使用的字符编码,以便正确地操作和处理数据。
下面列举了一些查询数据库字符集的SQL语句。
1. 查询MySQL数据库字符集:```SHOW VARIABLES LIKE 'character_set_database';```这条SQL语句可以查询MySQL数据库中当前数据库的字符集。
2. 查询Oracle数据库字符集:```SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_CHARACTERSET';```这条SQL语句可以查询Oracle数据库中当前数据库的字符集。
3. 查询SQL Server数据库字符集:```SELECT collation_name FROM sys.databases WHERE name = 'YourDatabaseName';这条SQL语句可以查询SQL Server数据库中指定数据库的字符集。
4. 查询PostgreSQL数据库字符集:```SELECT pg_encoding_to_char(encoding) FROM pg_database WHERE datname = 'YourDatabaseName';```这条SQL语句可以查询PostgreSQL数据库中指定数据库的字符集。
5. 查询DB2数据库字符集:```SELECT CODEPAGE FROM SYSCAT.DATABASES WHERE NAME = 'YourDatabaseName';```这条SQL语句可以查询DB2数据库中指定数据库的字符集。
6. 查询SQLite数据库字符集:```PRAGMA encoding;这条SQL语句可以查询SQLite数据库的字符集。
oracle字符集问题一般可以分为三类:数据库字符集(NLS_CHARACTERSET)、国家字符集(NLS_NCHAR_CHARACTERSET), sqlplus的字符集(客户端字符集), 终端程序的字符集(非oracle的)。
1、数据库字符集。
数据库字符集是所有字符问题的核心,只有数据库本身的字符集正确了,客户端的字符集才可能正确。
这里指的客户端包括sqlplus以及我们自己读数据库的应用程序。
在定位问题时,我们需要先看看数据库当前是什么字符集。
1)查询数据库字符集select * from nls_database_parameters其中nls_language表示了显示方式, 就是sqlplus的程序的显示字体,有SIMPLIFIED CHINESE,American america其中nls_characterset是字符集设定, 常用的一些字符集有UTF8,US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK, AL32UTF82)修改数据库字符集当发现数据库字符集不正确时,如我们期望时GBK的,而数据库当前是其他的,从而引起中文乱码。
这时我们需要修改数据库字符集。
步骤如下:$sqlplus /nologSQL>conn / as sysdba;若此时数据库服务器已启动,则先执行SHUTDOWN IMMEDIATE命令关闭数据库服务器,然后执行以下命令:SQL>STARTUP MOUNT;SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0;SQL>ALTER DATABASE OPEN;SQL>ALTER DATABASE CHARACTER SET ZHS16GBK; --设置数据库字符集如果出现错误使用:SQL>ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK;SQL>ALTER DATABASE national CHARACTER SET ZHS16GBK; -- 设置国家字符集SQL>SHUTDOWN IMMEDIATE;SQL>STARTUP2 客户端字符集如果服务器端的字符集是正确的,而在客户端下,如sqlplus仍然不能正确显示中文,这一般是由于服务器端的字符集设定与客户端的字符集设定不同造成的。
查oracle字符集编码Oracle是一种流行的关系型数据库管理系统,它支持多种字符集编码。
在处理多语言数据时,正确的字符集编码非常重要。
本文将介绍如何查看Oracle字符集编码。
1. 查看数据库字符集编码要查看Oracle数据库的字符集编码,可以使用以下SQL语句:SELECT * FROM nls_database_parameters WHEREparameter='NLS_CHARACTERSET';这将返回一个结果集,其中包含数据库的字符集编码。
2. 查看表的字符集编码要查看特定表的字符集编码,可以使用以下SQL语句:SELECT * FROM all_tab_columns WHEREtable_name='table_name' AND column_name='column_name';将“table_name”和“column_name”替换为要查询的表和列名称。
这将返回一个结果集,其中包含表的字符集编码。
3. 查看会话字符集编码要查看当前会话的字符集编码,可以使用以下SQL语句:SELECT * FROM nls_session_parameters WHEREparameter='NLS_CHARACTERSET';这将返回一个结果集,其中包含当前会话的字符集编码。
4. 修改字符集编码如果需要修改Oracle数据库的字符集编码,需要执行以下步骤:a. 停止数据库实例。
b. 备份数据库。
c. 修改数据库参数文件(init.ora或spfile)中的NLS_CHARACTERSET参数。
d. 启动数据库实例。
e. 使用ALTER DATABASE CHARACTER SET语句修改数据库中现有表和列的字符集编码。
f. 重新创建索引和约束。
g. 修改应用程序以使用新的字符集编码。
总结在处理多语言数据时,正确的字符集编码非常重要。
oracle sql查询字符集在Oracle SQL中,您可以使用以下方法查询数据库中的字符集:查询NLS_SESSION_PARAMETERS视图:使用以下SQL查询语句,您可以查看当前会话的字符集信息:SELECT parameter, valueFROM nls_session_parameters;这将返回当前会话的字符集参数,包括NLS_CHARACTERSET(字符集)和NLS_NCHAR_CHARACTERSET(NCHAR字符集)。
查询NLS_DATABASE_PARAMETERS视图:使用以下SQL查询语句,您可以查看数据库级别的字符集信息:SELECT parameter, valueFROM nls_database_parameters;这将返回数据库的字符集参数,包括NLS_CHARACTERSET(字符集)和NLS_NCHAR_CHARACTERSET(NCHAR字符集)。
查询V$NLS_PARAMETERS视图:使用以下SQL查询语句,您可以查看系统级别的字符集信息:SELECT parameter, valueFROM v$nls_parameters;这将返回系统级别的字符集参数,包括NLS_CHARACTERSET(字符集)和NLS_NCHAR_CHARACTERSET(NCHAR字符集)。
这些视图将提供与字符集相关的各种参数和值,以帮助您了解数据库的字符集设置。
请注意,字符集设置是非常重要的,因为它会影响文本和字符数据的存储和处理方式,尤其是在涉及多语言和国际化应用程序时。
当查询字符集信息时,还可以考虑以下内容:查询数据库版本:字符集信息可能会因Oracle数据库版本而异。
要查看数据库的版本信息,您可以运行以下SQL查询:SELECT * FROM v$version;这将返回有关Oracle数据库的版本和相关信息。
确保您的数据库版本与所需的字符集兼容。
修改字符集:如果您需要更改数据库的字符集,这是一个复杂而潜在危险的操作,因为它可能需要导致数据转换和潜在的数据丢失。
[原创]查看与修改oracle数据库字符集NLS_LANG参数格式NLS_LANG=<language>_<territory>.<client character set>Language:显⽰oracle消息,校验,⽇期命名Territory:指定默认⽇期、数字、货币等格式Client character set:指定客户端将使⽤的字符集例如:NLS_LANG=AMERICAN_AMERICA.ZHS16GBKAMERICAN是语⾔,AMERICA是地区,ZHS16GBK是客户端字符集1. 查看服务器端字符集:视图 "nls_database_parameters" 来源于props$,是表⽰数据库的字符集。
props$是创建数据库时存储在数据库中的信息。
select * from nls_database_parameters where parameter in ('NLS_LANGUAGE','NLS_TERRITORY','NLS_CHARACTERSET');select userenv('language') from dual;// ⽰例SQL> select userenv('language') from dual;USERENV('LANGUAGE')----------------------------------------------------SIMPLIFIED CHINESE_CHINA.ZHS16GBKSQL>2. 查看实例字符集:视图 "nls_instance_parameters" 来源于v$nls_parameters,表⽰会话⾃⼰的设置,可能是会话的环境变量或者是alter session完成,如果会话没有特殊的设置,将与nls_instance_parameters⼀致。
Oracle数据库字符集的查询
Oracle数据库字符集通俗的讲就是一个字节数据的相关的解释的符号集合,它具有大小的差异,也有互相包容关系。
Oracle是支持国家语言的相关体系结构,它允许你使用本地化语言来存储,处理,检索数据。
它使数据库工具,错误消息,排序次序,日期,时间,货币,数字,和日历自动适应本地化语言和平台。
影响oracle数据库字符集最重要的参数是NLS_LANG参数。
它的格式如下:
NLS_LANG = language_territory.charset 它有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。
其中:
Language 指定服务器消息的语言,territory 指定服务器的日期和数字格式,charset指定字符集。
如:AMERICAN _ AMERICA. ZHS16GBK。
从NLS_LANG的组成我们可以看出,真正影响Oracle数据库字符集的其实是第三部分。
所以两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据,前面影响的只是提示信息是中文还是英文。
如何查询Oracle的字符集
很多人都碰到过因为字符集不同而使数据导入失败的情况。
这涉及三方面的字符集,一是Oracel server端的字符集,二是oracle client端的字符集;三是dmp文件的字符集。
在做数据导入的时候,需要这三个字符集都一致才能正确导入。
1、查询Oracle Server端的字符集:
有很多种方法可以查出oracle server端的字符集,比较直观的查询方法是以下这种:
SQL>select userenv(‘language’) from dual; 结果类似如下:AMERICAN _ AMERICA. ZHS16GBK。
2、如何查询dmp文件的字符集:
用Oracle的exp工具导出的dmp文件也包含了字符集信息,dmp文件的第2 和第3个字节记录了dmp文件的字符集。
如果dmp文件不大,比如只有几M或几十M,可以用UltraEdit打开(16进制方式),看第2第3个字节的内容,如0354,然后用以下SQL查出它对应的字符集:
SQL> select nls_charset_name(to_number('0354','xxxx')) from dual; ZHS16GBK
如果dmp文件很大,比如有2G以上(这也是最常见的情况),用文本编辑器打开很慢或者完全打不开,可以用以下命令(在unix主机上):
cat exp.dmp od -x head -1 awk '{print $2 $3}' cut -c 3-6 然后用上述SQL也可以得到它对应的字符集。
3、查询Oracle client端的字符集:
这个比较简单。
在Windows平台下,就是注册表里面相应OracleHome的NLS_LANG。
还可以在Dos窗口里面自己设置,比如:
set nls_lang=AMERICAN_AMERICA.ZHS16GBK 这样就只影响这个窗口里面的环境变量。
在Unix平台下,就是环境变量NLS_LANG。
$echo $NLS_LANG AMERICAN_AMERICA.ZHS16GBK
如果检查的结果发现Server端与Client端字符集不一致,请统一修改为同Server端相同的字符集。
修改Oracle的字符集
Oracle的字符集有互相的包容关系
如us7ascii就是zhs16gbk的子集,从us7ascii到zhs16gbk不会有数据解释上的问题,不会有数据丢失。
在所有的字符集中utf8应该是最大,因为它基于unicode,双字节保存字符(也因此在存储空间上占用更多)。
一旦数据库创建后,数据库的字符集理论上讲是不能改变的。
因此,在设计和安装之初考虑使用哪一种字符集十分重要。
根据Oracle的官方说明,字符集的转换是从子集到超集受支持,反之不行。
如果两种字符集之间根本没有子集和超集的关系,那么字符集的转换是不受oracle支持的。
对数据库server而言,错误的修改字符集将会导致很多不可测的后果,可能会严重影响数据库的正常运行,所以在修改之前一定要确认两种字符集是否存在子集和超集的关系。
一般来说,除非万不得已,我们不建议修改oracle数据库server端的字符集。
特别说明,我们最常用的两种字符集ZHS16GBK和ZHS16CGB231280之间不存在子集和超集关系,因此理论上讲这两种字符集之间的相互转换不受支持。
修改Server端字符集(不建议使用):
在Oracle 8之前,可以用直接修改数据字典表props$来改变数据库的字符集。
但Oracle8之后,至少有三张系统表记录了Oracle数据库字符集的信息,只改props$表并不完全,可能引起严重的后果。
正确的修改方法如下:
$sqlplus /nolog SQL>conn / as sysdba;
若此时数据库服务器已启动,则先执行SHUTDOWN IMMEDIATE命令关闭数据库服务器,然后执行以下命令:
修改dmp文件字符集:
上文说过,dmp文件的第2第3字节记录了字符集信息,因此直接修改dmp 文件的第 2第3字节的内容就可以‘骗’过oracle的检查。
这样做理论上也仅是从子集到超集可以修改,但很多情况下在没有子集和超集关系的情况下也可以修改,我们常用的一些字符集,如US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK基本都可以改。
因为改的只是dmp 文件,所以影响不大。
具体的修改方法比较多,最简单的就是直接用UltraEdit修改dmp文件的第2和第3个字节。
比如想将dmp文件的字符集改为ZHS16GBK,可以用以下SQL
查出该种字符集对应的16进制代码:
SQL> select to_char(nls_charset_id('ZHS16GBK'), 'xxxx') from dual; 0354
然后将dmp文件的2、3字节修改为0354即可。
如果dmp文件很大,用ue无法打开,就需要用程序的方法了。
网上有人用java存储过程写了转换的程序(用java存储过程的好处是通用性教好,缺点是比较麻烦)。
我在Windows下测试通过。
但要求Oracle数据库一定要安装JVM
选项。
以上的相关内容就是对Oracle数据库字符集究竟的介绍,望你能有所收获。