Oracle字符集组成
NLS_LANGE参数:language territory.charset
它有三个组成部分(语言、地域和字符集)
查询oralce字符集
1:oracle server端字符集
select userenv(‘language’) from dual;
2:oracle client端字符集
在Linux平台:$echo $NLS_LANG
3:dmp文件的字符集
使用UltraEdit打开(十六进制方式)查看第2第3个字节的内容,如0354,然后用以下SQL查出它对应的字符集
selectnls_charset_name(to_number('0354','XXXX'))fromdual;
selectnls_charset_name(to_number('0001','XXXX'))fromdual;
修改oracle字符集
Utf是最大的字符集,是基于unicode双字节保留字符(也因此在存储空间上占用更多)
us7ascii是zhs16gbk的子集,从us7ascii到zhs16gbk不会有数据解释上的问题,不会有数据丢失。字符集的转换时从子集到超集受支持,反之不行。如果两种字符集之间根本没有子集和超集之间的关系,那么字符集的转换时不受oracle支持的。
1. 修改server端字符集
在Oracle8之前,可以直接修改数据字典表props$来修改数据库的字符集,但oracle8之后至少有三张表记录了数据库字符集的信息,只改props$并不完全,可能会引起严重的后果。正确方法如下:
以sysdba权限登录
如果数据库服务器已开启,则先执行shutdown immediate命令关闭数据库服务器,然后再执行如下命令:
SQL>startup mount;
SQL>alter system enable restricted session;
SQL>alter system setJOB_QUEUE_PROCESSES=0;
SQL>alter system setAQ_TM_PROCESSES=0;
SQL>alter database open;
SQL>alter database character set ZHS16GBK;
SQL>alter database natitional character set ZHS16GBK;
SQL>shutdown immediate;
SQL>startup
2. 修改client端字符集
3. 修改dmp文件字符集
使用UltraEdit将dmp文件打开,将第2第3个字节使用十六进制更改一下
selectto_char(nls_charset_id('US7ASCII'),'XXXX')fromdual;
产生乱码的原因以及解决方法:
- 服务器指定字符集和客户端指定字符集不同,而与加载数据库字符集一致。
这是情况是最常见的,只要把客户端的字符集设置正确即可。
解决方法:a.查看服务器端的字符集
select*fromv$nls_parameters;
b.按照服务器端字符集对客户端注册表进行配置
- 服务器指定字符集和客户端指定字符集相同,而与加载数据库字符集不一致。
这类问题一般发生在oracle版本升级或重装系统时选择了与原来服务器端不同的字符集,而恢复加载的备份数据仍是按原来字符集卸出的场合,以及加载从其他使用不同字符集的oracle。
解决方法:
方法1:在重装oracle时选择与原来卸出数据一致的字符集
方法2:强行修改服务器端oracle当前字符集
方法3:利用数据格式存储,避开字符集限制