ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle字符集问题的初步探讨

oracle字符集问题的初步探讨

原创 Linux操作系统 作者:steve352 时间:2009-02-08 22:43:02 0 删除 编辑

2:\>set nls_lang=AMERICAN_AMERICA.ZHS16GBK
set NLS_LANG AMERICAN_AMERICA.US7ASCII

 

? 字符集问题的初步探讨(七)-字符集更改的内部操作 | Blog首页 | Oracle字符集子集与超级的对应关系 ?

字符集问题的初步探讨(六)-乱码的产生
作者:eygle |English Version 【版权声明:转载时请务必以超链接形式标明文章原始出处和作者信息及本声明】
链接:http://www.eygle.com/archives/2004/09/nls_character_set_06.html
--------------------------------------------------------------------------------
站内相关文章|Related Articles
更改导出文件字符集的小工具

DBA警世录:更新系统表(props$)修改字符集

中文表名-导入导出-字符集

关于od命令不同平台下不同输出问题说明

Oracle字符集子集与超级的对应关系

原文发表于itpub技术丛书《Oracle数据库DBA专题技术精粹》,未经许可,严禁转载本文.

最后我们来讨论一下乱码的产生。

 

通常在我们的现实环境中,存在3个字符集设置。

第一: 客户端应用字符集(Client Application Character Set)

第二: 客户端NLS_LANG参数设置

第三: 服务器端,数据库字符集(Character Set)设置

 

我们说,一个字符在客户端应用(比如SQLPLUS,CMD,NOTEPAD等)中以怎样的字符显示取决于客户端操作系统,客户端能够显示怎样的字符,
我们就可以在应用中录入这些字符,至于这些字符能否在数据库中正常存储,就和另外的两个字符集设置紧密相关了。

在传输过程中,客户端NLS_LANG主要用于进行转换判断

如果NLS_LANG等于数据库字符集,则不进行任何转换直接把字符插入数据库

如果不同则进行转换,转换主要有两个任务

如果存在对应关系,则把相应二进制编码经过映射后(这一步映射以后,所代表的字符可能发生转换)传递给数据库
如果不存在对应关系,则传递一个替换字符(很多平台就是?)
 

数据库字符集,在和客户端NLS_LANG不同时,会把经过NLS_LANG转换的字符进行进一步处理

对于?(即不存在对应关系的字符)直接以?形式存放入数据库
对于其他字符,在NLS_LANG和数据库字符集之间进行转换后存入。
 

以下我们来看一下最为常见的字符集及乱码的产生:

1.当NLS_LANG字符集与数据库字符集不同,同时NLS_LANG不同于Server端字符集设置

在这种情况下,存在两种可能:

客户端输入的字符在NLS_LANG中没有对应的字符,这时无法转换,NLS_LANG使用替换字符替代这些无法映射的字符(这一步转换在TTS中
完成),在很多字符集中这个替代字符就是”?”
当客户端的字符在NLS_LANG中对应了不同的字符时,传递给数据库以后发生转换,存储的是字符,但是已经丢失了元数据,数据库中
的字符不再代表客户端的输入。而且这个过程不可逆,这也就是为什么很多时候在客户端输入的是正常的编码,查询之后会得到未知字符的原因。
 

我们通过上图来简单说明一下这个过程,当客户端在WE8ISO8859P15字符集时,输入欧元符号:

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7600171/viewspace-545598/,如需转载,请注明出处,否则将追究法律责任。

上一篇: linux学习日志
下一篇: oracle package
请登录后发表评论 登录
全部评论

注册时间:2008-01-10

  • 博文量
    30
  • 访问量
    84880