您的位置:首页 > 数据库 > Oracle

oracle错误消息字符串和表里字符串字段(分别)乱码的原因(NLS)

2016-01-05 13:51 495 查看
设计客户端nls_lang这个变量的作用是讲oracle服务端发来的所有字符串(包括错误消息字符串和表里字符串字段)的以服务端数据库字符集

编码的编码值转码为客户端字符集(狭义,即操作系统字符集)的编码值

故客户端nls_lang要和客户端字符集一致才好,否则就可能会乱码。客户端nls_lang要和客户端字符集间不转码,即设置为客户端字符集的客户端输出函数不转码

地显示以客户端nls_lang编码的

字符串为参数的值(从如下例子可知的:客户端nls_lang为ZHS16GBK,客户端字符集cmd 为代码页437时 如 表里的中文数据为乱码,而非?


字符,即可知道这里未发生转码)。

例如,输出函数如printf都是将要输出的字符串的编码值按照操作系统语言设置里(非Unicode)的字符集来解释显示
。该字符集设置改变,则原输出正常显示的字符串将变为乱码。

输出函数wprintf固定将要输出的字符串的编码值按照Unicode字符集来解释显示,与
操作系统语言设置里(非Unicode)的字符集设置无关。





表里char数据类型的字符串字段 在 服务端数据库里以database级别的nls_charset字符集编码的

表里nchar数据类型的字符串字段 在 服务端数据库里以database级别的nls_ncharset字符集编码的


错误消息字符串等由session级别的nls_language决定,而nls_language值对应用的字符集由oracle服务端软件决定

oracle服务端发来的错误消息字符串 根据客户端nls_lang 转码。证明如下:

其他条件不变,即 服务端数据库字符集为ZHS16GBK 客户端字符集cmd GBK,

客户端nls_lang 分别为

KOREAN_CHINA.KO16KSC5601

KOREAN_CHINA.AL32UTF8

时显示的乱码字符不一样,说明有转码。

再如,

其他不变 服务端数据库字符集为ZHS16GBK 客户端字符集cmd GBK(即ZHS16GBK)

客户端nls_lang

SIMPLIFIED CHINESE_CHINA.US7ASCII

显示??字符,说明有转码(源字符集的字符不存在目标字符集里时,一般转码为?字符)

oracle服务端发来的错误消息字符串是否按

服务端数据库字符集编码的?

服务端数据库字符集为ZHS16GBK还是AL32UTF8

客户端nls_lang为ZHS16GBK时不乱码;

客户端nls_lang为AL32UTF8时乱码;

客户端字符集cmd一直是 GBK

这个例子还不能证明上述结论,因为

(客户端nls_lang为)ZHS16GBK 和(服务端数据库字符集为)AL32UTF8间(共有的字符)是可正确转码的,

而客户端nls_lang为AL32UTF8时客户端cmd的字符集为 GBK,故最后显示为乱码。

服务端数据库字符集为ZHS16GBK 客户端字符集cmd 韩文

客户端nls_lang

KOREAN_CHINA.KO16KSC5601

不乱码 说明oracle服务端发来的错误消息字符串不按

服务端数据库字符集编码的,而是

错误消息字符串等由session级别的nls_language决定,而nls_language值对应用的字符集由oracle服务端软件决定。

参考:

Oracle中NLS_LANG的默认值

【不错】浅析Oracle三层全球化支持(NLS)

nls_lang Korea 百度

【不错 转自mos中文文章】Microsoft Windows 环境中NLS_LANG的正确设置

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: