Oracle字符集转换(三):3.客户端环境配置(二)
继续上一篇文章,我们看一下Oracle字符集转换客户端环境的配置。 Oracle服务器字符集和客户端NLS_LANG推荐的四种配置都可以勾选。
3.2.测试用例执行结果汇总
上一篇文章 Oracle字符集转换(二):3.配置客户端环境(一)每个测试用例的执行结果总结如下。
案例# | 服务器 字符集 | 客户端 NLS_LANG | 价值 | 输入 | 打印 | 倾倒 价值 |
---|---|---|---|---|---|---|
1 | US7ASCII | KO16KSC5601 | '韩国人' | 成功 | 断裂 | 类型=1 长度=2 字符集=US7ASCII: 3f,3f |
'锋利的' | 失败 | - | - | |||
2 | US7ASCII | KO16MSWIN949 | '韩国人' | 成功 | 断裂 | 类型=1 长度=2 字符集=US7ASCII: 3f,3f |
'锋利的' | 成功 | 断裂 | 类型=1 长度=1 字符集=US7ASCII: 3f | |||
3 | US7ASCII | US7ASCII | '韩国人' | 成功 | 普通的 | Typ=1 Len=4 字符集=US7ASCII: c7,d1,b1,db |
'锋利的' | 成功 | 普通的 | Typ=1 Len=2 字符集=US7ASCII: 98,de | |||
4 | KO16MSWIN949 | KO16KSC5601 | '韩国人' | 成功 | 普通的 | Typ=1 Len=4 字符集=KO16MSWIN949: c7,d1,b1,db |
'锋利的' | 失败 | - | - | |||
5 | KO16MSWIN949 | KO16MSWIN949 | '韩国人' | 成功 | 普通的 | Typ=1 Len=4 字符集=KO16MSWIN949: c7,d1,b1,db |
'锋利的' | 成功 | 普通的 | Typ=1 Len=2 字符集=KO16MSWIN949: 98,de | |||
6 | KO16MSWIN949 | US7ASCII | '韩国人' | 成功 | 断裂 | Typ=1 Len=4 字符集=KO16MSWIN949: 3f,3f,3f,3f |
'锋利的' | 成功 | 断裂 | 类型=1 长度=2 字符集=KO16MSWIN949: 3f,3f | |||
7 | AL32UTF8 | KO16KSC5601 | '韩国人' | 成功 | 普通的 | Typ=1 Len=6 字符集=AL32UTF8: ed,95,9c,ea,b8,80 |
'锋利的' | 失败 | - | - | |||
8 | AL32UTF8 | KO16MSWIN949 | '韩国人' | 成功 | 普通的 | Typ=1 Len=6 字符集=AL32UTF8: ed,95,9c,ea,b8,80 |
'锋利的' | 成功 | 普通的 | Typ=1 Len=3 字符集=AL32UTF8: ec,83,be | |||
9-1 | AL32UTF8 | AL32UTF8 (命令) | '韩国人' | 失败 | - | - |
'锋利的' | 失败 | - | - | |||
9-2 | AL32UTF8 | AL32UTF8 (电源外壳) | '韩国人' | 成功 | 普通的 | 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 | 评论 |
3 | US7ASCII | US7ASCII | 永远不要使用它仅在无法改变现有环境时使用! |
5 | KO16MSWIN949 | KO16MSWIN949 | 仅存储和输入输出韩文Windows支持的韩文字符、英文字符、数字、特殊字符、中文字符等(服务器中不能存储多语言字符) |
8 | AL32UTF8 | KO16MSWIN949 | 当服务器是多语言环境并且客户端仅输入和输出韩语时使用。当客户端应用程序无法处理 Unicode 时可以使用 |
9 | AL32UTF8 | AL32UTF8 | 服务器中存储的值不经转换直接传输到客户端。 也就是说,客户端必须直接处理UTF8编码的数据。 |
案例#3看起来输入输出没有问题,但是查看Dump值,可以看到字符集是US7ASCII。即表示实际的输入/输出是以US7ASCII的1字节为单位执行的,并且存储不正确。
当这些数据通过EAI、ETL、ESB等传输到外部系统时,韩文字符被破坏,并且很难准确地交换数据。因此,案例#3是绝对应该避免的设置。
情况9-1是由于Windows命令提示符cmd.exe不支持Unicode输入/输出而出现的现象,尽管原来的输入和输出设置没有任何问题。
在Windows PowerShell中查看案例9-2,可以看到输入输出正常。
为了存储除韩语之外的汉字、日语、泰语、西欧字符等多语言字符,可以采用以下两种组合。
案例# | 服务器 字符集 | 客户 NLS_LANG | 评论 |
8 | AL32UTF8 | 根据各语言字符设置 | 客户端 NLS_LANG 设置 – 如果是韩语:KO16MSWIN949 – 汉字:ZHS16GBK、ZHT16MSWIN950、ZHT16HKSCS – 日语字符:JA16SJIS – 泰文字符:TH8TISASCII等 见下表 |
9 | AL32UTF8 | AL32UTF8 | 服务器中存储的值不经转换直接传输到客户端。 也就是说,客户端必须直接处理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、存储韩文字符的无效环境下如何进行字符集转换。