oracle的字符集

[复制链接]
查看11 | 回复0 | 2016-10-18 22:44:00 | 显示全部楼层 |阅读模式
数据库的字符集是数据存储的编码形式,数据库在创建后,是不能修改字符集的,虽然有些命令可以修改,但是这并不正规,有可能会出现乱码,导致数据受损。因此在建库时对于字符集的选择一定要通过应用程序的开发人员确认。常见的字符集有zhs16gbk、utf8等。字符集有很多种,存在子集和超集的概念,严格意义上来说子集可以导入到超集的库中,其他情况的迁移都有可能存在乱码,需要经过CSSCAN工具的检测 。CSSCAN(CharacterSet Scanner utility)是Oracle提供的一个用于检查字符集转换过程中可能会出现的数据丢失或者损坏的情况。参考mos:ote 458122.1 Installing andConfiguring Csscan in 8i and 9i (Database Character Set Scanner)
Note 745809.1 Installing andconfiguring Csscan in 10g and 11g (Database Character Set Scanner)Csscan Output Explained (文档 ID 444701.1) 数据库的字符集的查询方法是:selectvalue from nls_database_parameters where parameter='NLS_CHARACTERSET';查询客户端会话当前应用的字符集环境select userenv('language') from dual; 这个值可以通过多方面来设置和影响,优先级如下alter session>环境变量NLS_LANG>注册表>数据库端参数文件字符集一般设置NLS_LANG环境变量比较常见。NLS_LANG参数由以下部分组成:NLS_LANG=_.NLS_LANG各部分含义如下:LANGUAGE指定:-Oracle消息使用的语言-日期中月份和日显示TERRITORY指定-货币和数字格式-地区和计算星期及日期的习惯CHARACTERSET:-控制客户端应用程序使用的字符集因此NLS_LANG的CHARACTERSET部分等于nls_database_parameters中NLS_CHARACTERSET即可。至于LANGUAGE和TERRITORY 根据客户端的支持字符来设置即可。如果不设置NLS_LANG则select userenv('language') from dual;的查询结果是根据“>注册表>数据库端参数文件字符集”取值。 如果设置了我们研究下它的影响:首先我们通过set nls_lang= 来取消nls_lang的值file:///C:/Users/oracle/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg查询结果与数据库端v$parameter参数nls_language设置一样。file:///C:/Users/oracle/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg如果我们设置一个错误的字符集file:///C:/Users/oracle/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpgfile:///C:/Users/oracle/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg都会提示ora-12705而无法连接数据库。如果我们设置一个和数据库不相同的数据库字符集file:///C:/Users/oracle/AppData/Local/Temp/msohtmlclip1/01/clip_image010.jpg可以连接,但是中文会出现部分乱码,此时查询会话的字符集,并未受NLS_LANG变量的影响,仍然是数据库字符集ZHS16GBK。如果NLS_LANG变量的_部分修改成AMERICAN_AMERICA,进入后执行select userenv('language') fromdual; 的结果会和NLS_LANG相同。file:///C:/Users/oracle/AppData/Local/Temp/msohtmlclip1/01/clip_image012.jpgNLS_LANG引发的问题: file:///C:/Users/oracle/AppData/Local/Temp/msohtmlclip1/01/clip_image014.jpg如上报错提示问号,是因为nls_lang的language部分没有正确设置,设置成AMERICAN_AMERICA即可。 如下图情况, sqlplus远程访问一个数据库,然后发现提示符等显示问号,通过select userenv('language') from dual;查询结果是简体中文的字符集,这种情况下如果设置NLS_LANG为SIMPLIFIED CHINESE_CHINA.ZHS16GBK ,因为操作系统不支持中文(英文操作系统)显示,所以依然是无法正常显示。这时设置NLS_LANG=AMERICAN_AMERICA.ZHS16GBK就可以用英文正常显示提示符了。 file:///C:/Users/oracle/AppData/Local/Temp/msohtmlclip1/01/clip_image016.jpg 所以nls_lang 的_部分并不一定要根据select userenv('language') from dual;的值来设置,可以根据客户端的环境来设置,或者直接设置成AMERICAN_AMERICA也是可以的。在exp/imp数据迁移的过程中,nls_lang 的_部分并不影响数据的迁移,但是CHARACTERSET必须要和数据库端一致。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行