Oracle字符集转换(二):3.配置客户端环境(一)
我们来看一下Oracle字符集转换客户端环境的配置。您可以将服务器字符集和客户端 NLS_LANG 设置分为 9 个测试用例,并检查每个测试用例的测试结果。
这是上一篇文章的延续。
Oracle字符集转换(一):1.必要性,正确的Oracle字符集设置指南
三、Oracle字符集转换客户端环境配置
Oracle客户端设置字符集的环境变量为NLS_LANG。
* 参考甲骨文文档: 使用 NLS_LANG 环境变量选择区域设置 (oracle.com)
通常,认为客户端 NLS_LANG 必须与服务器的字符集匹配,但这不是强制性的。服务器字符集是“保存”字符串数据的设置,客户端NLS_LANG是“显示”和“传输”字符串数据的设置。
也就是说,如果服务器字符集设置错误,就会导致字符串数据存储错误,如果客户端NLS_LANG设置错误,就会导致字符串数据显示错误、传输错误。
我们将服务器字符集和客户端NLS_LANG设置的情况定义如下,并查看测试结果。
案例# | 服务器字符集 | 客户端 NLS_LANG |
1 | US7ASCII | 美国_美国.KO16KSC5601 |
2 | US7ASCII | AMERICAN_AMERICA.KO16MSWIN949 |
3 | US7ASCII | AMERICAN_AMERICA.US7ASCII |
4 | KO16MSWIN949 | 美国_美国.KO16KSC5601 |
5 | KO16MSWIN949 | AMERICAN_AMERICA.KO16MSWIN949 |
6 | KO16MSWIN949 | AMERICAN_AMERICA.US7ASCII |
7 | AL32UTF8 | 美国_美国.KO16KSC5601 |
8 | AL32UTF8 | AMERICAN_AMERICA.KO16MSWIN949 |
9 | AL32UTF8 | AMERICAN_AMERICA.AL32UTF8 |
为了测试不同的服务器字符集,在本地PC上配置了3个Oracle实例,TNS名称分别指定为oraus7、oramswin949和orautf。
- oraus7:US7ASCII
- oramswin949: KO16MSWIN949
- orautf:AL32UTF8
每个测试用例选择了两个输入值:“Hangul”和“Sharp”。
“Hangul”旨在检查是否可以进行常规朝鲜文输入和输出,“Sharp”旨在检查 KSC5601 不支持的字符的输入和输出。
测试脚本(示例)及说明如下。
-- Windows command prompt 환경 title Test Case (1) US7ASCII, AMERICAN_AMERICA.KO16KSC5601 set NLS_LANG=AMERICAN_AMERICA.KO16KSC5601 sqlplus -S leg/leg@oraus7 -- sqlplus 환경 TRUNCATE TABLE Z_TEST; INSERT INTO Z_TEST(VAL) VALUES('한글'); INSERT INTO Z_TEST(VAL) VALUES('샾'); COMMIT; SELECT VAL, DUMP(VAL, 1016) DP FROM Z_TEST; EXIT;
- 第2行:设置命令提示符窗口的标题,以便于识别(每个测试用例设置不同,见下文)
- 第 3 行:NLS_LANG 设置(针对每个测试用例设置不同,见下文)
- 第 4 行:执行并连接到 sqlplus(每个测试用例设置不同。见下文)
- 第 7 行:截断测试表 (Z_TEST)
- 第 8 行:输入值“Hangul”
- 第 9 行:输入“Sharp”值
- 第 10 行:运行 COMMIT
- 第11行:输出输入值和DUMP函数的结果。
- 注意:如果将DUMP函数的第二个参数设置为1016,则可以检查存储值的长度(字节数)、字符集以及每个字节的十六进制表达值。
- 第 12 行:结束
3.1。测试用例的结果
3.1.1.案例 #1 (US7ASCII – KO16KSC5601)
- 服务器字符集:US7ASCII (sqlplus -Sleg/leg@us7ascii)
- 客户端 NLS_LANG:AMERICAN_AMERICA.KO16KSC5601
- 执行结果
- 'Hangul':输入成功,输出失败(输出为问号(??))
- “尖锐”:输入失败
3.1.2.案例 #2 (US7ASCII – KO16MSWIN949)
- 服务器字符集:US7ASCII (sqlplus -Sleg/leg@us7ascii)
- 客户端 NLS_LANG:AMERICAN_AMERICA.KO16MSWIN949
- 执行结果
- 'Hangul':输入成功,输出失败(输出为问号(??))
- ‘Sharp’:输入成功,输出失败(输出为问号(?))
3.1.3.案例 #3 (US7ASCII – US7ASCII)
- 服务器字符集:US7ASCII (sqlplus -Sleg/leg@us7ascii)
- 客户端 NLS_LANG:AMERICAN_AMERICA.US7ASCII
- 执行结果
- 'Hangul':输入、输出成功(存储错误)
- ‘Shop’:输入、输出成功(存储错误)
3.1.4.案例 #4 (KO16MSWIN949 – KO16KSC5601)
- 服务器字符集:KO16MSWIN949 (sqlplus -Sleg/leg@oramswin949)
- 客户端 NLS_LANG:AMERICAN_AMERICA.KO16KSC5601
- 执行结果
- 'Hangul':输入、输出成功
- “尖锐”:输入失败
3.1.5。案例 #5 (KO16MSWIN949 – KO16MSWIN949)
- 服务器字符集:KO16MSWIN949 (sqlplus -Sleg/leg@oramswin949)
- 客户端 NLS_LANG:AMERICAN_AMERICA.KO16MSWIN949
- 执行结果
- 'Hangul':输入、输出成功
- 'Shop':输入、输出成功
3.1.6。案例 #6 (KO16MSWIN949 – US7ASCII)
- 服务器字符集:KO16MSWIN949 (sqlplus -Sleg/leg@oramswin949)
- 客户端 NLS_LANG:AMERICAN_AMERICA.US7ASCII
- 执行结果
- 'Hangul':输入成功,输出失败(输出为问号(???))
- ‘Shop’:输入成功,输出失败(输出为问号(??))
3.1.7.外壳 #7 (AL32UTF8 – KO16KSC5601)
- 服务器字符集:AL32UTF8(sqlplus -Sleg/leg@orautf)
- 客户端 NLS_LANG:AMERICAN_AMERICA.KO16KSC5601
- 执行结果
- 'Hangul':输入、输出成功
- “尖锐”:输入失败
3.1.8.案例 #8 (AL32UTF8 – KO16MSWIN949)
- 服务器字符集:AL32UTF8(sqlplus -Sleg/leg@orautf)
- 客户端 NLS_LANG:AMERICAN_AMERICA.KO16MSWIN949
- 执行结果
- 'Hangul':输入、输出成功
- 'Shop':输入、输出成功
3.1.9.案例 #9-1 (AL32UTF8 – AL32UTF8)
- 服务器字符集:AL32UTF8(sqlplus -Sleg/leg@orautf)
- 客户端 NLS_LANG:AMERICAN_AMERICA.AL32UTF8
- 执行结果
- 'Hangul':输入、输出成功
- ‘Shop’:输入失败:Windows命令提示符(cmd.exe)的默认代码页是949(ANSI),并且不支持UTF-8输入/输出,因此无法正常运行。如果使用支持UTF-8输入输出的PowerShell(案例#9-2)运行,可以确认输入输出正常。
3.1.10.案例 #9-2 (AL32UTF8 – AL32UTF8) – 使用支持 UTF-8 的 PowerShell 运行
- 服务器字符集:AL32UTF8(sqlplus -Sleg/leg@orautf)
- 客户端 NLS_LANG:AMERICAN_AMERICA.AL32UTF8
- 执行结果
- 'Hangul':输入、输出成功
- 'Shop':输入、输出成功
到目前为止,我们已经了解了 Oracle 字符集转换客户端环境的配置以及每个测试用例的结果。在下一篇文章中,我们将总结这些结果并查看推荐的配置。