oracle字符集点点滴滴(东摘西抄,记录备忘)

来源:互联网 发布:迈达斯 软件 大赛 编辑:程序博客网 时间:2024/06/11 13:26

1.exp导出文件头的第2、3个字节,我们可以找到16进制表示的字符集ID;
 十六进制转换为十进制: select to_number('7D','XXXXX') from dual
 对字符集名称及ID进行转换: select nls_charset_name(852) from dual;

2.oracle字符集转换:a)操作系统-b)客户端nls_language-c)数据库字符集     
 1)若bc不同,则做两次转换后保存(首先保持编码不变找到b对应字符-可能对应错,然后根据字符集转换得到c对应编码);
 2)若bc相同,不做任何转换保存(保持编码不变找到c对应字符-可能找不到,前后端均为US7ASCII、存中文会产生负负得正的效果) 
 3)客户端的字符集要求与服务器一致,才能正确显示数据库的非Ascii字符。如果多个设置存在的时候,alter session>环境变量>注册表>参数文件

3.Oracle支持两种Unicode数据存储方法。
 1)第一种被称为Unicode数据库解决方案,它可以创建一个基于Unicode的数据库,使用UTF-8编码格式,不仅为CHAR和VARCHAR2字符数据类型进行编码,而且还对所有的SQL名和字面值进行编码。(这里CLOB是个特殊情况,因为Oracle 数据库10g在Unicode数据中总是使用UTF-16对CLOB进行编码。)为了实施Unicode数据库解决方案,将你的数据库字符集配置为AL32UTF8,这是UTF-8的Oracle名称。 UTF-8编码与ASCII向后兼容。任何合法的ASCII编码都会自动成为合法的UTF-8编码,使得将现有的ASCII数据库转换为Unicode数据库非常容易。UTF-8使用一个码点值来生成一个分布到一到四个字节上的位模式。 第二种重要的编码格式是UTF-16,它使用了一个双字节的编码单元。最重要的是,UTF-16和ASCII一样简单,因为编码单元的值与0x0000到0xFFFF范围内的任意码点的码点值相同。对于该范围内的字符,UTF-16是固定长度的双字节编码。
 2)另一种是Unicode数据类型解决方案,在该解决方案中UTF-16数据被保存在NCHAR、NVARCHAR和NCLOB等Unicode数据类型中。当你希望在非Unicode数据库的列级获得Unicode支持时,这是一个理想的解决方案。为了实施该解决方案,将你的国家字符集设置为AL16UTF16,这是UTF-16的Oracle名称。实际上,从Oracle9i数据库开始,将AL16UTF16作为国家字符集是默认的设置。

4.exp,imp时的字符集转换过程:
1)做exp时,系统会比较前后端字符集,如果相同,就直接exp,如果不同,就发生转换,比如从字符集A转到B。做imp时,首先会比较exp的字符集B和当前前端字符集C是否相同,如果相同就执行imp,如果不同就首先进行转换,但能转换的前提是必须为单字节字符集,如果不是单字节字符集则会提示imp错误 ,这个也是为什么US7ASCII的dmp文件,不能在ZHS16GBK前端下imp的原因;
2)字符集怎么转换?例如ZHS16GBK和ZHS16231280,一般是以UTF8作为中介(所有的字符集中utf8应该是最大),因为它几乎包含其他一切字符,如果映射不到的就产生“?”号.