Oracle字符集转换(三):3.客户端环境配置(二)

继续上一篇文章,我们看一下Oracle字符集转换客户端环境的配置。 Oracle服务器字符集和客户端NLS_LANG推荐的四种配置都可以勾选。

3.2.测试用例执行结果汇总

上一篇文章 Oracle字符集转换(二):3.配置客户端环境(一)每个测试用例的执行结果总结如下。

案例#服务器
字符集
客户端 NLS_LANG价值输入打印倾倒 价值
1US7ASCIIKO16KSC5601'韩国人'成功断裂类型=1 长度=2 字符集=US7ASCII: 3f,3f
'锋利的'失败--
2US7ASCIIKO16MSWIN949'韩国人'成功断裂类型=1 长度=2 字符集=US7ASCII: 3f,3f
'锋利的'成功断裂类型=1 长度=1 字符集=US7ASCII: 3f
3US7ASCIIUS7ASCII'韩国人'成功普通的Typ=1 Len=4 字符集=US7ASCII: c7,d1,b1,db
'锋利的'成功普通的Typ=1 Len=2 字符集=US7ASCII: 98,de
4KO16MSWIN949KO16KSC5601'韩国人'成功普通的Typ=1 Len=4 字符集=KO16MSWIN949: c7,d1,b1,db
'锋利的'失败--
5KO16MSWIN949KO16MSWIN949'韩国人'成功普通的Typ=1 Len=4 字符集=KO16MSWIN949: c7,d1,b1,db
'锋利的'成功普通的Typ=1 Len=2 字符集=KO16MSWIN949: 98,de
6KO16MSWIN949US7ASCII'韩国人'成功断裂Typ=1 Len=4 字符集=KO16MSWIN949: 3f,3f,3f,3f
'锋利的'成功断裂类型=1 长度=2 字符集=KO16MSWIN949: 3f,3f
7AL32UTF8KO16KSC5601'韩国人'成功普通的Typ=1 Len=6 字符集=AL32UTF8: ed,95,9c,ea,b8,80
'锋利的'失败--
8AL32UTF8KO16MSWIN949'韩国人'成功普通的Typ=1 Len=6 字符集=AL32UTF8: ed,95,9c,ea,b8,80
'锋利的'成功普通的Typ=1 Len=3 字符集=AL32UTF8: ec,83,be
9-1AL32UTF8AL32UTF8
(命令)
'韩国人'失败--
'锋利的'失败--
9-2AL32UTF8AL32UTF8
(电源外壳)
'韩国人'成功普通的Typ=1 Len=6 字符集=AL32UTF8: ed,95,9c,ea,b8,80
'锋利的'成功普通的Typ=1 Len=3 字符集=AL32UTF8: ec,83,be

3.3 Oracle服务器字符集和客户端NLS_LANG推荐配置

用于韩文输入/输出的 Oracle 服务器和客户端环境的配置可以采用以下四种组合。

案例#服务器
字符集
客户
NLS_LANG
评论
3US7ASCIIUS7ASCII永远不要使用它仅在无法改变现有环境时使用!
5KO16MSWIN949KO16MSWIN949仅存储和输入输出韩文Windows支持的韩文字符、英文字符、数字、特殊字符、中文字符等(服务器中不能存储多语言字符)
8AL32UTF8KO16MSWIN949当服务器是多语言环境并且客户端仅输入和输出韩语时使用。当客户端应用程序无法处理 Unicode 时可以使用
9AL32UTF8AL32UTF8服务器中存储的值不经转换直接传输到客户端。
也就是说,客户端必须直接处理UTF8编码的数据。

案例#3看起来输入输出没有问题,但是查看Dump值,可以看到字符集是US7ASCII。即表示实际的输入/输出是以US7ASCII的1字节为单位执行的,并且存储不正确。

Case #3 실행결과
案例#3执行结果

当这些数据通过EAI、ETL、ESB等传输到外部系统时,韩文字符被破坏,并且很难准确地交换数据。因此,案例#3是绝对应该避免的设置。

情况9-1是由于Windows命令提示符cmd.exe不支持Unicode输入/输出而出现的现象,尽管原来的输入和输出设置没有任何问题。
在Windows PowerShell中查看案例9-2,可以看到输入输出正常。

为了存储除韩语之外的汉字、日语、泰语、西欧字符等多语言字符,可以采用以下两种组合。

案例#服务器
字符集
客户
NLS_LANG
评论
8AL32UTF8根据各语言字符设置客户端 NLS_LANG 设置
– 如果是韩语:KO16MSWIN949
– 汉字:ZHS16GBK、ZHT16MSWIN950、ZHT16HKSCS
– 日语字符:JA16SJIS
– 泰文字符:TH8TISASCII等
见下表
9AL32UTF8AL32UTF8服务器中存储的值不经转换直接传输到客户端。
也就是说,客户端必须直接处理UTF8编码的数据。

上面提到的Client NLS_LANG值列表<根据每种语言字符设置>如下。

操作系统区域设置NLS_LANG 值
阿拉伯语(阿联酋)ARABIC_阿拉伯联合酋长国.AR8MSWIN1256
保加利亚语保加利亚语_BULKARIA.CL8MSWIN1251
加泰罗尼亚语CATALAN_CATALONIA.WE8MSWIN1252
中文(中华人民共和国)简体中文_CHINA.ZHS16GBK
中文(台湾)繁体中文_台湾.ZHT16MSWIN950
中文(香港HKCS)繁体中文_香港.ZHT16HKSCS
中文(香港HKCS2001)繁体中文_香港.ZHT16HKSCS2001(10gR1新版)
克罗地亚语克罗地亚_克罗地亚.EE8MSWIN1250
捷克语CZECH_捷克共和国.EE8MSWIN1250
丹麦语丹麦_丹麦.WE8MSWIN1252
荷兰语(荷兰)DUTCH_THE 荷兰.WE8MSWIN1252
荷兰语(比利时)DUTCH_BELGIUM.WE8MSWIN1252
英语(英国)ENGLISH_UNITED KINGDOM.WE8MSWIN1252
美国英语)AMERICAN_AMERICA.WE8MSWIN1252
爱沙尼亚语爱沙尼亚_爱沙尼亚.BLT8MSWIN1257
芬兰FINNISH_FINLAND.WE8MSWIN1252
法语(加拿大)加拿大法语_CANADA.WE8MSWIN1252
法语(法国)FRENCH_FRANCE.WE8MSWIN1252
德语(德国)GERMAN_GERMANY.WE8MSWIN1252
希腊语GREEK_GREECE.EL8MSWIN1253
希伯来语HEBREW_ISRAEL.IW8MSWIN1255
匈牙利匈牙利_匈牙利.EE8MSWIN1250
冰岛的ICELANDIC_ICELAND.WE8MSWIN1252
印度尼西亚印度尼西亚_印度尼西亚.WE8MSWIN1252
意大利语(意大利)ITALIAN_ITALY.WE8MSWIN1252
日本人JAPANESE_JAPAN.JA16SJIS
韩国人KOREAN_KOREA.KO16MSWIN949
拉脱维亚语拉脱维亚语_拉脱维亚.BLT8MSWIN1257
立陶宛语立陶宛_立陶宛.BLT8MSWIN1257
挪威挪威_挪威.WE8MSWIN1252
抛光波兰_波兰.EE8MSWIN1250
葡萄牙语(巴西)巴西葡萄牙语_BRAZIL.WE8MSWIN1252
葡萄牙语(葡萄牙)PORTUGUESE_PORTUGAL.WE8MSWIN1252
罗马尼亚语ROMANIAN_ROMANIA.EE8MSWIN1250
俄语俄罗斯_CIS.CL8MSWIN1251
斯洛伐克语斯洛伐克_斯洛伐克.EE8MSWIN1250
西班牙语(西班牙)SPANISH_SPAIN.WE8MSWIN1252
瑞典SWEDISH_SWEDEN.WE8MSWIN1252
泰国THAI_THAILAND.TH8TISASCII
西班牙语(墨西哥)墨西哥西班牙语_MEXICO.WE8MSWIN1252
西班牙语(委内瑞拉)拉丁美洲西班牙语_VENEZUELA.WE8MSWIN1252
土耳其土耳其_土耳其.TR8MSWIN1254
乌克兰UKRAINIAN_UKRAINE.CL8MSWIN1251
越南语越南_越南.VN8MSWIN1258

*来源: NLS_LANG 常见问题解答 (oracle.com) 该文件的细节

这里可能会出现一个问题。

服务器的字符集指定为AL32UTF8,一种Unicode系统,但为什么客户端NLS_LANG要指定KO16MSWIN949,一种2字节系统?

这是因为 Windows 操作系统是编码/解码朝鲜文的基本方法。 (供参考,在UNiX上输入输出韩文字符时,常见使用KO16KSC5601。)再提一下,Server Character Set是“存储”字符串数据的设置,而Client NLS_LANG“显示”字符串数据。,这是“传输”的设置。

服务器字符集指定 AL32UTF8 这种 Unicode 系统来“存储”各国的字符,而连接到此的各国客户端(主要是 Windows)环境则使用 Windows 对每种语言支持的基本编码/解码系统server.指定以非 Unicode 输入的数据将转换为 Unicode 并保存,同时通过 Oracle 客户端和 SQL*Net 传输到服务器。


当服务器字符集为AL32UTF8时,如果客户端NLS_LANG设置为AL32UTF8,则将服务器中存储的Unicode值传输到客户端,无需任何转换过程。换句话说,如果客户端NLS_LANG要设置为AL32UTF8,则客户端必须能够编码/解码Unicode。

作为参考,在免费提供的工具中,ORACLE SQL Developer 是很好支持 Unicode 的代表性工具。 DBeaver基于jdbc还很好地支持Unicode。


如果你因为目前的内容比较复杂而觉得字符集选择比较困难,那么你只需要记住下面的内容即可。

  • 服务器字符集设置为 AL32UTF8
  • 客户端 NLS_LANG
    • 如果客户端无法处理Unicode或仅限于特定语言,请设置与该语言对应的值
    • AL32UTF8(如果客户端可以处理 Unicode)

到目前为止,我们已经了解了与Oracle字符集相关的客户端环境配置。

下一篇我们将看看在服务器字符集为US7ASCII、存储韩文字符的无效环境下如何进行字符集转换。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

zh_CN简体中文