oracle字符集问题总结

上一篇 / 下一篇  2012-11-12 11:16:16

Oracle字符集组成

NLS_LANGE参数:language territory.charset

它有三个组成部分(语言、地域和字符集)

 

查询oralce字符集

1oracle server端字符集

  select userenv(‘language’) from dual;

2oracle client端字符集

  Linux平台:$echo $NLS_LANG

3dmp文件的字符集

  使用UltraEdit打开(十六进制方式)查看第23个字节的内容,如0354,然后用以下SQL查出它对应的字符集

selectnls_charset_name(to_number('0354','XXXX'))fromdual;

selectnls_charset_name(to_number('0001','XXXX'))fromdual;

 

                                                          

修改oracle字符集

Utf是最大的字符集,是基于unicode双字节保留字符(也因此在存储空间上占用更多)

us7asciizhs16gbk的子集,从us7asciizhs16gbk不会有数据解释上的问题,不会有数据丢失。字符集的转换时从子集到超集受支持,反之不行。如果两种字符集之间根本没有子集和超集之间的关系,那么字符集的转换时不受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文件字符集

使用UltraEditdmp文件打开,将第23个字节使用十六进制更改一下

selectto_char(nls_charset_id('US7ASCII'),'XXXX')fromdual;

 

产生乱码的原因以及解决方法:

  1. 服务器指定字符集和客户端指定字符集不同,而与加载数据库字符集一致。

这是情况是最常见的,只要把客户端的字符集设置正确即可。

解决方法:a.查看服务器端的字符集

         select*fromv$nls_parameters;

         b.按照服务器端字符集对客户端注册表进行配置

  1. 服务器指定字符集和客户端指定字符集相同,而与加载数据库字符集不一致。

这类问题一般发生在oracle版本升级或重装系统时选择了与原来服务器端不同的字符集,而恢复加载的备份数据仍是按原来字符集卸出的场合,以及加载从其他使用不同字符集的oracle

解决方法:

方法1:在重装oracle时选择与原来卸出数据一致的字符集

方法2:强行修改服务器端oracle当前字符集

方法3:利用数据格式存储,避开字符集限制


TAG:

 

评分:0

我来说两句

日历

« 2024-05-01  
   1234
567891011
12131415161718
19202122232425
262728293031 

我的存档

数据统计

  • 访问量: 38069
  • 日志数: 18
  • 建立时间: 2012-11-06
  • 更新时间: 2012-11-20

RSS订阅

Open Toolbar