Microsoft Windows 环境中NLS_LANG的正确设置 (Doc ID 1577370.1)
文档内容
用途 |
适用范围 |
详细信息 |
1. 主要概念/术语: |
1.1 Microsoft Windows系统的代码页: |
1.2 字体: |
2. 如何设置我的 NLS_LANG: |
2.1 注册表中: |
2.2 系统属性中作为系统或者用户变量: |
2.3 在命令提示符中设置为环境变量: |
3. 基于Microsoft Windows 代码页为非unicode程序正确设置NLS_LANG: |
3.1 判断您的 Windows ACP 代码页 (使用 sqlplusW.exe): |
3.2 找出对应的Oracle客户端字符集: |
3.3 在注册表中设置: |
4. 命令提示符OEM 代码页的正确NLS_LANG(sqlplus.exe使用) : |
4.1 Microsoft Windows缺省配置 |
4.2 更改Microsoft windows命令提示符环境使用ANSI 字符集 如 1252 |
5. 如何检查NLS_LANG的值 |
6. Microsoft Windows注册表中常用NLS_LANG的列表: |
7. Microsoft Windows命令提示符中常用NLS_LANG的列表: |
8. Windows上为Unicode应用程序设置正确的NLS_LANG: |
9. Windows如何使用字体来显示不同的字符集: |
10. 更新/更改注册表中的NLS_LANG为正确的值: |
参考 |
Oracle Database - Standard Edition - 版本 8.0.3.0 和更高版本
Oracle Database - Enterprise Edition - 版本 8.0.3.0 和更高版本
Oracle Database - Personal Edition - 版本 8.0.3.0 和更高版本
Microsoft Windows x64 (64-bit)
Microsoft Windows (32-bit)
Microsoft Windows Itanium (64-bit)
综述在Microsoft Windows平台如何正确的定义NLS_LANG变量。
DBA在任意Microsoft Windows desktop/server平台上配置Oracle RDBMS客户端。(不包括 Microsoft Windows Mobile/CE/tablet)。
此文档涵盖了NLS_LANG的字符集部分, 也提供了Note:158577.1 NLS_LANG Explained (How does Client-Server Character Conversion Work?)之外更多的与 Microsoft Windows平台相关信息
NLS_LANG的组成: NLS_LANG=<NLS_Language>_<NLS_Territory>.<客户端字符集>
例如: AMERICAN_AMERICA.WE8MSWIN1252
其中:
NLS_Language 指定:
- Oracle(错误)信息的语言
- 日和月份的名称
NLS_Territory 指定:
- 货币和数字格式
- 计算星期和天数的范围和惯例
客户端字符集(CLIENTS CHARACTERSET):
- 定义Oracle客户端,客户应用使用的编码
* 或者它要符合您Microsoft Windows代码页 (GUI工具的ACP, 命令提示符的CHCP 值)
* 或者为Unicode WIN32应用设置为UTF8/AL32UTF8
四个重要附注:
* 设置NLS_LANG为数据库(NLS_CHARACTERSET)的字符集,可能正确但不是总是正确的。请不要断定NLS_LANG需要与数据库字符集一致,这是不正确的
* NLS_LANG定义的字符集不更改您客户端的字符集,NLS_LANG只是让Oracle知道您客户端使用的字符集,所以Oracle可以在NLS_CHARACTERSET和客户端编码间转化。
您不能只是设置NLS_LANG为您期望的字符集。如您想在Cyrillic windows上显示希伯来文(例如),Windows系统首先要更改为支持1255 编码(参见第三点),之后,在Windows上配置NLS_LANG。
只是设定nls_lang为Hebrew不能满足您检索和存储希伯来文的需求。
* 另一个谣言是如果您不设置客户端的NLS_LANG,它会使用服务器端NLS_LANG的值。这也是不正确的!NLS_LANG的字符集参数不会从服务器端继承。请参见:NLS参数优先级的解释。
* 注意一种语言的字符在数据库保存(insert)或查询(select)与NLS_LANGUAGE 和 NLS_TERRITORY无关。如NLS_LANG 设置为JAPANESE_JAPAN.WE8MSWIN1252不能够存储日文,因为WE8MSWIN1252不包含日文字符
对于NLS_LANG中NLS_Language 和 NLS_Territory部分,请参见 Document 241047.1 The Priority of NLS Parameters Explained(NLS参数优先级的解释)。
Microsoft Windows操作系统中,非unicode应用程序的编码模式(字符集)由代码页指定。代码页支持特定的语言或语言组,共享常见的书写系统。
从Oracle的角度代码页和字符集是等价的。
Microsoft Windows对ANSI (像sqlplusw.exe这样的非unicode GUI程序) 和 OEM (命令提示符 - sqlplus.exe)环境使用2种不同的字符集。
举例说明这个问题:
这里您看到的是“ANSI”编码(写字板)在OEM (命令提示符)环境中显示。这清晰的展示了windows在ANSI和命令提示符环境中使用不同的字符集。
Microsoft Windows命令提示符使用MS-DOS (OEM)传统代码页不是“gui” 交互使用的ANSI代码页。
更多关于这方面的问题,请咨询Microsoft。
字体是字形(从“象形文字”)的集合,有着共同的外观(字型,字符大小)。操作系统使用字体把数字值转换成屏幕上的图形结构。
一个字体不一定包含您所使用代码页中定义的所有数值的图形表示。这就是为什么当您更改字体,如果新的字体没有对应的符号表示,您有时会看到屏幕上的黑色方块。
Microsoft Windows “Character Set Map”实用程序可以被用作查看字体包含何种字形。
在Microsoft Windows 2000中:
字体可以实现一个特定的代码页或者代码页集合。例如,Arial字体可以实现代码页 1252, 1250, 1251, 1253, 1254, 1257。
有关字体更深入的信息,请参加本文档第8点。
为指定您客户端Oracle软件的locale信息,您必须设置NLS_LANG参数。它设置了客户端的语言,地域和字符集信息。
简单的说,它使用下面的格式:
NLS_LANG=NLS_Language_NLS_Territory.客户端字符集
例如:AMERICAN_AMERICA.WE8MSWIN1252
默认情况下,windows上的Oracle安装使用注册表来定义这个设置。
通用安装程序设置的默认值取决于安装时Microsoft Windows操作系统的ACP值。
您的每个Oracle Home中会有一个NLS_LANG注册表subkey,您能简单的通过Windows注册表编辑器来修改subkey的值:
开始 -> 运行...
输入 “regedit”, 点击 “ok”
编辑下面的注册表条目:
版本 7:
版本 8 , 8i and 9i:
“x”为定义Oracle home的唯一值。HOME0是首次安装
版本 10g 及以上:
这里您会看到一个条目名为NLS_LANG
在64位windows平台上安装32位软件,会使用32位兼容性路径
当启动Oracle工具,如sqlplusw.exe (或 sqplus.exe), 它将读取相同路径下oracle.key文件的内容,来决定哪个注册表树将被使用,进而哪个NLS_LANG subkey将被使用。
尽管注册表是Microsoft Windows设置的主要存储位置,它不是唯一可以设置参数的地方。
虽然不推荐,但您可以设置NLS_LANG为系统属性中的系统或者用户变量。这个设置会被所有Oracle home使用。
查看和更改:
“用户变量”列表包含目前登陆用户的设置,“系统变量”是操作系统级别所有用户的变量。
因为这些环境变量比注册表中已经设置的参数级别高,所以除非您有非常好的理由否则不要在这个位置设置Oracle参数。
请注意"ORACLE_HOME"参数在Unix中被设置为环境变量,但是如果有多个Oracle安装,在Windows下不应该设置其为环境变量。
如果您在命令行中设置NLS_LANG为环境变量,它将覆盖注册表和系统属性中的NLS_LANG的定义。
在命令提示符中,使用“set”命令,例如:
NLS_LANG反映了Microsoft Windows对非unicode应用程序的"locale"设置,如果Windows的"locale"设置不是您需要的,那么您需要修改。
ACP(Ansi代码页)和缺省 OEM(命令提示符代码页)是由Windows“缺省 locale”定义的,如果您有一个UK Microsoft Windows 2000 客户端,需要输入Cyrillic (俄语),您需要更改ACP (更改“default locale”)从而能够输入俄语。
请参见 Document 199926.1 How to change the ANSI Code Page (ACP) on Microsoft Windows.
不是所有的语言都有ANSI编码,Windows的sqlplus只支持ANSI 和 OEM字符集。
下面的链接提供了Microsoft Windows Xp及以后版本每种言语的缺省代码页列表: http://msdn.microsoft.com/en-gb/goglobal/bb896001.aspx
OEM = 命令提示符codepage, ANSI = gui代码页
列表中ANSI代码页为0意味着Microsoft windows只在Unicode层支持这种语言,没有ANSI 代码页
列表中OEM 代码页为1意味着Microsoft windows只在Unicode层支持这种语言,没有OEM 代码页
如果您想要在windows客户端中查看/插入有0 或 1值的语言,您需要使用Unicode客户端。Sqlplusw.exe 或者 sqlplus.exe 不是Unicode客户端(但是它们能连接到Unicode数据库),不能对这种语言使用。.
您能在Microsoft Windows NT, 2000 和 XP可以使用UTF8/AL32UTF8作为Oracle客户端字符集(NLS_LANG),但是限制是只能在客户端程序支持这种配置的时候使用。
http://msdn.microsoft.com/en-gb/goglobal/bb964653.aspx 提供了Microsoft Windows ANSI 和 OEM代码页的定义。
对于如sqlloader等工具,您需要设置NLS_LANG为您需要加载文件的字符集。
Document 227330.1 Character Sets & Conversion - Frequently Asked Questions
18. What is the best way to load non-US7ASCII characters using SQL*Loader?
对于导入/导出请参见: Document 227332.1 NLS considerations in Import/Export
对于 Honk Kong HKSCS 请参见 Document 787371.1 Oracle Database Server support for HKCSC 1999, 2001 and 2004 character sets.
您能在注册表中看到它的值:
开始 -> 运行...
输入 “regedit”, 点击 “ok”
查看下面的注册表条目:
您能看到一个条目名为ACP。这个ACP值为您目前的GUI 代码页,查看下面列表3.2可以对应到oracle名字。
由于有很多注册表条目名称与其类似,请确认查看的是正确的路径。
依照3.1中的ACP在下面的表中找到Oracle客户端字符集。
注意对于一个ACP只有一个正确的值
ANSI并不支持所有的脚本/语言。Microsoft Windows中ANSI不支持下面的语言:
Armenian, Divehi, Georgian, Gujarati, Hindi, Kannada, Oriya, Konkani, Marathi, Punjabi, Sanskrit, Syriac, Tamil and Telugu. (此部分只为示例, 请参见本文档 3.1)
这是windows开始菜单中GUI sqlplus (sqlplusW.exe/ plus80W.exe / plus33W.exe )使用的字符集。
请一定要区别GUI sqlplusW.exe 和命令提示符sqlplus.exe(参见本文档第4点)
使用Windows注册表编辑器在Oracle Home中设置您刚找到的NLS_LANG的值。2.1部分详细的介绍了如何使用注册表编辑器。
命令提示符模式(除了一些例外如中日韩语言),是一个不同的代码页 (叫做 OEM 代码页)而不是Microsoft Windows GUI (ANSI 代码页)。
在命令提示符使用命令行工具如SQL*Plus (sqlplus.exe/ plus80.exe / plus33.exe ) svrmgrl之前,您需要手动设置NLS_LANG参数为环境变量。
对于日文,韩文,简体中文,和繁体中文,命令提示符OEM 代码页 (CJK)被定义为ANSI 代码页,意味着您不需要在命令提示符中设置NLS_LANG参数。
OEM并不支持所有的脚本/语言。Microsoft Windows中OEM不支持下列语言:
Armenian, Divehi, Georgian, Gujarati, Hindi, Kannada, Oriya, Konkani, Marathi, Punjabi, Sanskrit, Syriac, Tamil and Telugu. (此部分只为示例, 请参见本文档 3.1)
在其他的情况下,您需要设置NLS_LANG来覆盖注册表中已经匹配ANSI 代码页的NLS_LANG。命令提示符专有NLS_LANG需要匹配命令提示符中输入chcp后显示的命令提示符OEM 代码页
如果命令提示符模式的NLS_LANG没有被正确的设置,错误信息和数据将因为不正确的字符集转换而损坏。
使用下面的列表找到在您的locale 系统中满足命令提示符代码页 的Oracle字符集:
对于如sqlloader等工具,您需要设置NLS_LANG为您需要加载文件的字符集。
Document 227330.1 Character Sets & Conversion - Frequently Asked Questions
18. What is the best way to load non-US7ASCII characters using SQL*Loader?
对于导入/导出请参见: Document 227332.1 NLS considerations in Import/Export
可以配置命令提示符使用ANSI编码。要在console窗口中使用ANSI字符集,您需要使用“Lucida Console”因为“raster fonts”只识别OEM代码页
右击标题栏,选择属性,找到字体项,选择Lucida Console。点击“ok”之后选择“Save properties for future windows with same title”。
之后我们可以执行,例如“chcp 1252”来切换到WE8MSWIN1252字符集。
注意:
* “Unicode” “chcp 65001” 和 “chcp 65000”不支持sqlplus.exe。
* “chcp”不是永久生效的,所以需要每次修改或者设定快捷方式。如果您打开一个新的命令提示符窗口,默认情况下,它会使用这个Windows系统缺省OEM代码页定义。
一种可能的解决办法是在注册表的命令处理器中添加所需的chcp为自动运行
REGEDIT4
;
; 当打开命令提示符,自动运行chcp
;
; 针对当前用户:
[HKEY_CURRENT_USER\Software\Microsoft\Command Processor]
"Autorun"="chcp 1252"
; 针对所有用户:
;[HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor]
;"Autorun"="chcp 1252"
有关如何更改缺省的chcp的更多信息,请咨询Microsoft。
检查NLS_LANG,您需要打开命令提示符,在命令行中运行sqlplus.exe。
首先参见在环境中是否设置:
如果返回的是%NLS_LANG%,这个变量在环境中没有被设置。如果返回如ENGLISH_UNITED KINGDOM.WE8PC850说明已被设置。
如果NLS_LANG在环境中没有被设置,您应该参见注册表中的值:
如果您得到:
在‘[]'中的“文件名”是注册表参数的值。(这不是一个错误只是得到NLS_LANG值的“窍门”)
如果您得到:
说明NLS_LANG参数在注册表中也没有被设置。
ANSI并不支持所有的脚本/语言。
Microsoft Windows中ANSI不支持下面的语言:
Armenian, Divehi, Georgian, Gujarati, Hindi, Kannada, Oriya, Konkani, Marathi, Punjabi, Sanskrit, Syriac, Tamil and Telugu. (此部分只为示例, 请参见本文档 3.1)
OEM并不支持所有的脚本/语言。
Microsoft Windows中OEM不支持下面的语言:
Armenian, Divehi, Georgian, Gujarati, Hindi, Kannada, Oriya, Konkani, Marathi, Punjabi, Sanskrit, Syriac, Tamil and Telugu. (此部分只为示例, 请参见本文档 3.1)
大多数命令提示符EM 代码页不支持Euro symbol (€)
支持Unicode程序的例子
* NT 4.0上Oracle Forms 版本5及以上版本. Document 105809.1 Character Set Support for Developer Tools
* iSqlplus.
Document 231231.1 Quick setup of iSQL*Plus 9.2 as Unicode (UTF8) client on windows.
Document 281847.1 How do I configure or test iSQL*Plus 10i?
Windows使用UTF16(Little Endian)作为Unicode的编码,但是NLS_LANG需要被设置为UTF8或者AL32UTF8,而不是UTF16。
Oracle客户端类库会做相应的转换(字节移位操作,非常快)将Windows UTF16转换成Oracle的AL32UTF8,或者数据库的NLS_CHARACTERSET。
只有当某些使用了Oracle预编译器的时候UTF16才会被使用。如果您有进一步关于编写Windows Unicode程序的问题,请联系微软。MSDN上有一篇介绍http://msdn.microsoft.com/en-us/library/dd374081(VS.85).aspx
Windows上有些连接方式同NLS_LANG的设置无关,比如:
假设您有一个AL32UTF8数据库并正确的存储AL32UTF8代码点。
Windows中有两类工具/应用:
1)完全支持Unicode的应用程序,它接受Unicode的代码点,并可以使它们。处理Unicode是应用程序的职责,Windows只是提供了Unicode API,但它的GUI系统本身“缺省”不是Unicode。
完全支持Unicode的应用程序对于一个给定的Unicode代码点只能显示一个字形。因此,它不会产生歧义,这个应用程序同时需要使用一个完整支持Unicode的字体。如果你有一个完全支持Unicode的应用程序,你可以设置NLS_LANG为AL32UTF8
请注意,目前没有很多的应用程序是这样的,如果它没有由供应商明确提到,它最有可能为ANSI应用程序(见下文)。所以如果您不确定,不要设置NLS_LANG为AL32UTF8!
ISQLPLUS是数据库中Unicode的客户端。请参见Document 231231.1 Quick setup of iSQL*Plus as Unicode client on windows. 还有就是SqlDeveloper。
2) 一个标准ANSI应用(如sqlplusw.exe),不能使用Unicode代码点。因此,存储在数据库中的Unicode代码点需要被转换成ANSI代码点。这是通过设置NLS_LANG来完成(在本文档中有进一步描述)。这使Oracle映射Unicode到客户端的字符集(如sqlplus),(这是棘手的部分)但这和字体不同。
例如你想显示阿拉伯语,你需要设置Windows的LOCALE为阿拉伯。这样,Windows知道什么是正确的代码点,并且可以使用字体引擎来显示代码点(这个字形)。
Windows传递代码点和 “页”到翻译引擎。这个阿拉伯语“页”定义了字符集/代码页的代码点的字形。
ANSI应用程序,一个字体通常包含不同语言的字形,这个“页”用来选择一个字体(例如)包含西里尔文,阿拉伯文和西欧文的所有字形, 是阿拉伯文“页”。
因此,您有一个阿拉伯文的设置,您手动更改字体“页”,并要求显示字形为ANSI代码点XX。 2件事中的1件可能发生:
1) “页”的字符集有这个字符,字体的创建者已经预览到字形,它被显示(但是它不是想要的因为它将作为不同的字符存储在数据库!)。
2) “页”的字符集没有这个字符,字体的创建者没有预览到字形,你会得到黑色方块。 (通常你应该看到一个(黑色)方块,但一些字体中为? 或 ?也有可能,这依赖于字体中定义的错误处理)。
您也可能在一个非Unicode字符集的数据库中看到上述情形。
例如可以通过导入.reg文件,它将删除旧的插入新的注册表值
如:
NOTE:199926.1 - How to change the ANSI Code Page (ACP) on Windows NT 4.0 and Windows 2000 / XP