Oracle服务端与客户端字符集
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Oracle客户端与服务端字符集
Oracle 数据库对字符的处理及表现形式分为三个层面,优先级先后分别是数据库初始化参数字符集、OS操作系统环境变量级、session级。
数据库初始化参数字符集是在建数据库前指定的字符集,使用如下语句查询数据库字符集:
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.ZHS16GBK
完整字符集名称分为三部分:语言_地域.字符集,这里以
AMERICAN_AMERICA.ZHS16GBK 和SIMPLIFIED CHINESE_CHINA.ZHS16GBK 为例说明各部分的含义:
语言决定了提示信息使用的语言,如AMERICAN表示使用英语,SIMPLIFIED CHINESE表示使用简体中文;
地域决定了缺省的日期格式等,如:
AMERICA的时间格式为:
SQL>select sysdate from dual;
SYSDATE
------------
20-AUG-12
CHINA的时间格式为:
SQL>select sysdate from dual;
SYSDATE
--------------
20-8月-12
字符集的格式为<语言><比特位数><编码>比如: ZHS16GBK表示采用GBK 编码格式、16位(两个字节)简体中文字符集。
数据库建立后字符集原则上不要修改,如果修改可以用命令alter database set character set xxx; 不过这样修改有一定的危险,有可能会出现乱码造成数据的丢失,而且修改后的字符集一定是修改前字符集的超集,修改数据库字符集一般采用两种方法:
1.导出数据库数据,重建数据库,再导入数据库数据的方式来转换。
2.通过ALTER DATABASE CHARACTER SET语句修改字符集,具体操作
如下:
1)关闭数据库
SQL>SHUTDOWN IMMEDIATE
2)启动到Mount
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 NATIONAL CHARACTER SET ZHS16GBK;
SQL>SHUTDOWN IMMEDIATE;
SQL>STARTUP
注:启动数据库后应将有改动的JOB_QUEUE_PROCESSES、AQ_TM_PROCESSES等参数修改为原有值。
NLS_CHARACTERSET设置服务器的字符集。
NLS_LANG客户端字符集定义了客户端字符数据的编码方式,任何发自或发往客户端的字符数据均使用客户端定义的字符集编码,客户端可以看作是能与数据库直接连接的各种应用。如:当某客户端的NLS_LANG配置的字符集为:SIMPLIFIED CHINESE_CHINA.ZHS16CGB231280,但Oracle服务端配置的字符
集为:SIMPLIFIED CHINESE_CHINA.ZHS16GBK,这样通过客户端操作的字符数据将ZHS16CGB231280字符集编码,则可能导致一些ZHS16CGB231280字符集中不包含的特殊字符出现乱码。
SQL> select '闫珅豪' from dual;
'闫?豪'
------------
闫?豪
因此在配置客户端字符集时应与Oracle服务端字符集保持一致,但是语言设置却可以不同,语言设置建议用英文。
设置客户端字符集可修改.cshrc或.bash_profile配置文件中的NLS_LANG与Oracle服务端一致的字符集,或使用如下命令:
cshrc:
setenv NLS_LANG "SIMPLIFIED CHINESE_CHINA.ZHS16GBK"
bash_profile:
export NLS_LANG='SIMPLIFIED CHINESE'_CHINA.ZHS16GBK
总之,当业务数据存入数据库后中文字符出现乱码时,我们应当查看对数据库存在DML操作的子系统所在服务器配置的NLS_LANG,如果与数据库的字符集不一致,则需修改服务器的NLS_LANG与数据库字符集保持一致;同时,在创建数据库时选择正确的数据库字符集十分重要,这样可以避免由于修改数据库字符集造成的数据异常问题。
附录:Oracle字符集子集、超集对照表
Oracle字符集子集
、超集对照表.docx