admin 管理员组文章数量: 887021
Microsoft Windows 环境中NLS_LANG的正确设置 (文档 ID 1577370.1)
适用于:
Oracle Database - Enterprise Edition - 版本 8.0.3.0 和更高版本
Oracle Database - Personal Edition - 版本 8.0.3.0 和更高版本
Oracle Database - Standard Edition - 版本 8.0.3.0 和更高版本
Oracle Database Cloud Schema Service - 版本 N/A 和更高版本
Oracle Database Exadata Express Cloud Service - 版本 N/A 和更高版本
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)。
详细信息
要调试显示问题 (当您看到奇怪的符号或字符,如 "?" , "¿" 或 "ÃÂÃÂÂ") 请首先使用 Oracle SQL Developer 进行调试。
Oracle SQL Developer 是一款无需在客户端进行 Oracle NLS 配置的“已知的可用客户端”。
检查配置 Oracle SQL Developer 的文档及截屏请参见note 1628060.1 How to diagnose losing characters , getting "funny" output when inserting or selecting other than A-Z,a-z data ( = non English data like Chinese, Russian, Hebrew , insert any language here to the list that is not English) CHAR, VARCHAR2, LONG or CLOB
1. 主要概念/术语:
此文档涵盖了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_LANGUAGE与插入和查询的*数据*的语言无关。
NLS_TERRITORY 指定:
- 货币和数字格式
- 计算星期和天数的范围和惯例
注意:NLS_TERRITORY与插入和查询的*数据*的语言无关。
客户端字符集(CLIENT 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的字符集参数不会从服务器端继承。
* 注意字符在数据库保存(insert)或查询(select)与NLS_LANGUAGE 和 NLS_TERRITORY无关。如NLS_LANG 设置为JAPANESE_JAPAN.WE8MSWIN1252不能够存储日文,因为WE8MSWIN1252不包含日文字符
但是如果NLS_LANG设置为AMERICAN_AMERICA.JA16SJIS, 那么你可以存储日文(如果数据库也使用了可以存储日文的NLS_CHARACTERSET,比如UTF8或者JA16SJIS,并且客户端确实是一个日文的Windows系统).
对于NLS_LANG中NLS_Language 和 NLS_Territory部分,请参见 Note 241047.1 The Priority of NLS Parameters Explained(NLS参数优先级的解释)。
1.1 Microsoft Windows系统的代码页:
Microsoft Windows操作系统中,非unicode应用程序的编码模式(字符集)由代码页指定。代码页支持特定的语言或语言组,共享常见的书写系统。
从Oracle的角度代码页和字符集是等价的。
注意非中文-日文-韩文环境中,Microsoft Windows GUI和命令提示符不使用相同的代码页 (!)
Microsoft Windows对ANSI (像sqlplusw.exe这样的非unicode GUI程序) 和 OEM (命令提示符 - sqlplus.exe)环境使用2种不同的字符集。
举例说明这个问题:
打开写字板, 输入一些 “特殊字符” 如“é?èà”, 另存文件为 c:\test.txt
(确认当另存文件时,编码设置为ANSI)
打开命令提示符
开始 – 运行 - cmd - ok
然后输入
C:\Documents and Settings\user>edit c:\test.txt
您将看到其他的字符而不是写字板中输入的
这里您看到的是“ANSI”编码(写字板)在OEM (命令提示符)环境中显示。这清晰的展示了windows在ANSI和命令提示符环境中使用不同的字符集。
Microsoft Windows命令提示符使用MS-DOS (OEM)传统代码页不是“gui” 交互使用的ANSI代码页。
更多关于这方面的问题,请咨询Microsoft。
请一定要区分GUI sqlplusW.exe 和 "命令提示符" sqlplus.exe
1.2 字体:
字体是字形(从“象形文字”)的集合,有着共同的外观(字型,字符大小)。操作系统使用字体把数字值转换成屏幕上的图形结构。
一个字体不一定包含您所使用代码页中定义的所有数值的图形表示。这就是为什么当您更改字体,如果新的字体没有对应的符号表示,您有时会看到屏幕上的黑色方块。
Microsoft Windows “Character Set Map”实用程序可以被用作查看字体包含何种字形。
在Microsoft Windows 2000中:
开始 -> 所有程序 -> 附件 -> 系统工具 -> Character Map
或者
开始 -> 运行...
输入 "charmap", 然后点击 "ok"
字体可以实现一个特定的代码页或者代码页集合。例如,Arial字体可以实现代码页 1252, 1250, 1251, 1253, 1254, 1257。
有关字体更深入的信息,请参加本文档第8点。
2. 如何设置我的 NLS_LANG:
为指定您客户端Oracle软件的locale信息,您必须设置NLS_LANG参数。它设置了客户端的语言,地域和字符集信息。
简单的说,它使用下面的格式:
NLS_LANG=NLS_Language_NLS_Territory.客户端字符集
例如:AMERICAN_AMERICA.WE8MSWIN1252
2.1 注册表中:
默认情况下,windows上的Oracle安装使用注册表来定义这个设置。
通用安装程序设置的默认值取决于安装时Microsoft Windows操作系统的ACP值。
您的每个Oracle Home中会有一个NLS_LANG注册表subkey,您能简单的通过Windows注册表编辑器来修改subkey的值:
开始 -> 运行...
输入 “regedit”, 点击 “ok”
编辑下面的注册表条目:
版本 7:
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE
版本 8 , 8i and 9i:
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMEx\
“x”为定义Oracle home的唯一值。HOME0是首次安装
版本 10g 及以上:
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_<oracle_home_name>
这里您会看到一个条目名为NLS_LANG
在64位windows平台上安装32位软件,会使用32位兼容性路径
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE\KEY_<oracle_home_name>
注意:
* 32位软件安装在Microsoft Windows64位操作系统上将没有以下路径
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_<oracle_home_name>
Microsoft Windows会重定向到“32位兼容性路径”
* Oracle不支持将32位数据库软件安装在Microsoft Windows 64位操作系统上。您可以安装32位客户端软件,但是不能安装32位数据库软件。 详见note 1173433.1 How to Install Oracle 10.2.0.5 on MS Windows 7 / Windows 2008R2
* 一个已知的问题Bug 8277395: WINDOWS 2008 X64 10.2.0.4 INSTALLATION DOESN'T SET NLS_LANG REGISTRY , windows x64 bit在安装时没有设置NLS_LANG
当启动Oracle工具,如sqlplusw.exe (或 sqplus.exe), 它将读取相同路径下oracle.key文件的内容,来决定哪个注册表树将被使用,进而哪个NLS_LANG subkey将被使用。
注意:有时候人们会发现即使没有安装版本7, HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE的NLS_LANG也会被设为“NA”。这是因为向后兼容性的需要,您可以忽略或者移除它。对于8.0, 8i 和 9i您需要在HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMEx\下设置NLS_LANG
2.2 系统属性中作为系统或者用户变量:
尽管注册表是Microsoft Windows设置的主要存储位置,它不是唯一可以设置参数的地方。
虽然不推荐,但您可以设置NLS_LANG为系统属性中的系统或者用户变量。这个设置会被所有Oracle home使用。
查看和更改:
右击 '我的电脑' 图标 -> '属性'
选择 '高级' 项 -> 点击 '环境变量'
“用户变量”列表包含目前登陆用户的设置,“系统变量”是操作系统级别所有用户的变量。
因为这些环境变量比注册表中已经设置的参数级别高,所以除非您有非常好的理由否则不要在这个位置设置Oracle参数。
请注意"ORACLE_HOME"参数在Unix中被设置为环境变量,但是如果有多个Oracle安装,在Windows下不应该设置其为环境变量。
2.3 在命令提示符中设置为环境变量:
如果您在命令行中设置NLS_LANG为环境变量,它将覆盖注册表和系统属性中的NLS_LANG的定义。
在命令提示符中,使用“set”命令,例如:
C:\> set NLS_LANG=American_America.WE8PC850
3. 基于Microsoft Windows 代码页为非unicode程序正确设置NLS_LANG:
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/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),但是限制是只能在客户端程序支持这种配置的时候使用。
依赖于ANSI Win32 API的程序,如SQL*Plus (sqlplusW.exe),旧版本的Oracle Forms等等。不能设置NLS_LANG 为 UTF8 / AL32UTF8。
http://msdn.microsoft/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.
3.1 判断您的 Windows ACP 代码页 (使用 sqlplusW.exe):
您能在注册表中看到它的值:
开始 -> 运行...
输入 “regedit”, 点击 “ok”
查看下面的注册表条目:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage\
您能看到一个条目名为ACP。这个ACP值为您目前的GUI 代码页,查看下面列表3.2可以对应到oracle名字。
由于有很多注册表条目名称与其类似,请确认查看的是正确的路径。
如果您需要修改“ACP”请参见: Document 199926.1 How to change the ANSI Code Page (ACP) on Windows NT 4.0 and Windows 2000 / XP
不要简单的只在注册表中修改它,这将出现问题并导致错误的结果。
3.2 找出对应的Oracle客户端字符集:
依照3.1中的ACP在下面的表中找到Oracle客户端字符集。
注意对于一个ACP只有一个正确的值
请参考note 282336.1 Charts of most current mono-byte Character sets来查看一些字符集中具体存储了哪些字符
ANSI并不支持所有的脚本/语言。Microsoft Windows中ANSI不支持下面的语言:
Armenian, Divehi, Georgian, Gujarati, Hindi, Kannada, Oriya, Konkani, Marathi, Punjabi, Sanskrit, Syriac, Tamil and Telugu. (此部分只为示例, 请参见本文档 3.1)
ANSI代码页(ACP) - Oracle 客户端字符集 (NLS_LANG的第三部分)
1250 - EE8MSWIN1250
1251 - CL8MSWIN1251
1252 - WE8MSWIN1252
1253 - EL8MSWIN1253
1254 - TR8MSWIN1254
1255 - IW8MSWIN1255
1256 - AR8MSWIN1256
1257 - BLT8MSWIN1257
1258 - VN8MSWIN1258
874 - TH8TISASCII
932 - JA16SJIS
936 - ZHS16GBK
949 - KO16MSWIN949
950 - ZHT16MSWIN950 - except for Hong kong.
950 - (Hong Kong) ZHT16HKSCS31 / ZHT16HKSCS .
只在Microsoft Windows 2000 和 XP上有, Vista 和 7没有,
参见 Document 787371.1 Oracle Database Server support for HKCSC 1999, 2001 and 2004 character sets.
这是windows开始菜单中GUI sqlplus (sqlplusW.exe/ plus80W.exe / plus33W.exe )使用的字符集。
请一定要区别GUI sqlplusW.exe 和命令提示符sqlplus.exe(参见本文档第4点)
3.3 在注册表中设置:
使用Windows注册表编辑器在Oracle Home中设置您刚找到的NLS_LANG的值。2.1部分详细的介绍了如何使用注册表编辑器。
4. 命令提示符OEM 代码页的正确NLS_LANG(sqlplus.exe使用) :
4.1 Microsoft Windows缺省配置
命令提示符模式(除了一些例外如中日韩语言),是一个不同的代码页 (叫做 OEM 代码页)而不是Microsoft Windows GUI (ANSI 代码页)。
大多数命令提示符OEM 代码页不支持Euro symbol (€),请参见:Document 68790.1 RDBMS Support for the Euro Currency Symbol请参考note 282336.1 Charts of most current mono-byte Character sets来查看一些字符集中具体存储了哪些字符
在命令提示符使用命令行工具如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 代码页
C:\> chcp
Active code page: 437
C:\> set NLS_LANG=American_America.US8PC437
C:\> sqlplus.exe /nolog
如果命令提示符模式的NLS_LANG没有被正确的设置,错误信息和数据将因为不正确的字符集转换而损坏。
使用下面的列表找到在您的locale 系统中满足命令提示符代码页 的Oracle字符集:
命令提示符 代码页 - Oracle 客户端字符集 (NLS_LANG的第三部分)
437 - US8PC437
720 - AR8DOS720
737 - EL8PC737
850 - WE8PC850
852 - EE8PC852
857 - TR8PC857
858 - WE8PC858
861 - IS8PC861
862 - IW8PC1507
865 - N8PC865
866 - RU8PC866
-- 和ANSI相同 :
1258 - VN8MSWIN1258
874 - TH8TISASCII
932 - JA16SJIS
936 - ZHS16GBK
949 - KO16MSWIN949
950 - ZHT16MSWIN950 - except for Hong kong.
950 - (Hong Kong) ZHT16HKSCS31 / ZHT16HKSCS .
只在Microsoft Windows 2000 和 XP上有, Vista 和 7没有,
参见 Document 787371.1 Oracle Database Server support for HKCSC 1999, 2001 and 2004 character sets.
对于如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
4.2 更改Microsoft windows命令提示符环境使用ANSI 字符集 如 1252
可以配置命令提示符使用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。
5. 如何检查NLS_LANG的值
检查NLS_LANG,您需要打开命令提示符,在命令行中运行sqlplus.exe。
首先参见在环境中是否设置:
SQL> host echo %NLS_LANG%
如果返回的是%NLS_LANG%,这个变量在环境中没有被设置。如果返回如ENGLISH_UNITED KINGDOM.WE8PC850说明已被设置。
如果NLS_LANG在环境中没有被设置,您应该参见注册表中的值:
SQL> @.[%NLS_LANG%].
如果您得到:
unable to open file ".[ENGLISH_UNITED KINGDOM.WE8MSWIN1252]."
在‘[]'中的“文件名”是注册表参数的值。(这不是一个错误只是得到NLS_LANG值的“窍门”)
如果您得到:
unable to open file ".[%NLS_LANG%]."
说明NLS_LANG参数在注册表中也没有被设置。
注意:@.[%NLS_LANG%]。通过“窍门” 在sqlplus可执行文件中获得NLS_LANG,它不会读注册表本身。但您仍然不知道它是在环境中还是注册表中被设置。这是我们先使用host命令参见的原因。
6. Microsoft Windows注册表中常用NLS_LANG的列表:
注意:这是GUI sqlplus版本的正确设置,(sqlplusW.exe/ plus80W.exe / plus33W.exe )
ANSI并不支持所有的脚本/语言。
Microsoft Windows中ANSI不支持下面的语言:
Armenian, Divehi, Georgian, Gujarati, Hindi, Kannada, Oriya, Konkani, Marathi, Punjabi, Sanskrit, Syriac, Tamil and Telugu. (此部分只为示例, 请参见本文档 3.1)
操作系统Locale ANSI gui的NLS_LANG值
Arabic (U.A.E.) ARABIC_UNITED ARAB EMIRATES.AR8MSWIN1256
Bulgarian BULGARIAN_BULGARIA.CL8MSWIN1251
Catalan CATALAN_CATALONIA.WE8MSWIN1252
Chinese (PRC) SIMPLIFIED CHINESE_CHINA.ZHS16GBK
Chinese (Taiwan) TRADITIONAL CHINESE_TAIWAN.ZHT16MSWIN950
Chinese (Hong Kong HKCS) TRADITIONAL CHINESE_HONG KONG.ZHT16HKSCS
Chinese (Hong Kong HKCS31) TRADITIONAL CHINESE_HONG KONG.ZHT16HKSCS31 (new in 10gR2)
HKSCS 只在Microsoft Windows 2000 和 XP上有, Vista 和 7没有,
参见 Document 787371.1 Oracle Database Server support for HKCSC 1999, 2001 and 2004 character sets.
Croatian CROATIAN_CROATIA.EE8MSWIN1250
Czech CZECH_CZECH REPUBLIC.EE8MSWIN1250
Danish DANISH_DENMARK.WE8MSWIN1252
Dutch (Belgium) DUTCH_BELGIUM.WE8MSWIN1252
Dutch (Netherlands) DUTCH_THE NETHERLANDS.WE8MSWIN1252
English (United Kingdom) ENGLISH_UNITED KINGDOM.WE8MSWIN1252
English (United States) AMERICAN_AMERICA.WE8MSWIN1252
Estonian ESTONIAN_ESTONIA.BLT8MSWIN1257
Finnish FINNISH_FINLAND.WE8MSWIN1252
French (Canada) CANADIAN FRENCH_CANADA.WE8MSWIN1252
French (France) FRENCH_FRANCE.WE8MSWIN1252
German (Germany) GERMAN_GERMANY.WE8MSWIN1252
Greek GREEK_GREECE.EL8MSWIN1253
Hebrew HEBREW_ISRAEL.IW8MSWIN1255
Hungarian HUNGARIAN_HUNGARY.EE8MSWIN1250
Icelandic ICELANDIC_ICELAND.WE8MSWIN1252
Indonesian INDONESIAN_INDONESIA.WE8MSWIN1252
Italian ITALIAN_ITALY.WE8MSWIN1252
Japanese JAPANESE_JAPAN.JA16SJIS
Korean KOREAN_KOREA.KO16MSWIN949
Latvian LATVIAN_LATVIA.BLT8MSWIN1257
Lithuanian LITHUANIAN_LITHUANIA.BLT8MSWIN1257
Norwegian NORWEGIAN_NORWAY.WE8MSWIN1252
Polish POLISH_POLAND.EE8MSWIN1250
Portuguese (Brazil) BRAZILIAN PORTUGUESE_BRAZIL.WE8MSWIN1252
Portuguese (Portugal) PORTUGUESE_PORTUGAL.WE8MSWIN1252
Romanian ROMANIAN_ROMANIA.EE8MSWIN1250
Russian RUSSIAN_CIS.CL8MSWIN1251
Slovak SLOVAK_SLOVAKIA.EE8MSWIN1250
Spanish (Mexico) MEXICAN SPANISH_MEXICO.WE8MSWIN1252
Spanish (Spain) SPANISH_SPAIN.WE8MSWIN1252
Spanish (Venezuela) LATIN AMERICAN SPANISH_VENEZUELA.WE8MSWIN1252
Swedish SWEDISH_SWEDEN.WE8MSWIN1252
Thai THAI_THAILAND.TH8TISASCII
Turkish TURKISH_TURKEY.TR8MSWIN1254
Ukrainian UKRAINIAN_UKRAINE.CL8MSWIN1251
Vietnamese VIETNAMESE_VIETNAM.VN8MSWIN1258
*需要注意的是NLS_LANGUAGE和NLS_TERRITORY和数据库是否能存储(插入)或检索(选择)某种语言的字符无关。
在设置为1252(US/West Eruopean Windows客户端)上设置NLS_LANG为 JAPANESE_JAPAN.WE8MSWIN1252将不允许您存储日文,因为WE8MSWIN1252不支持日文字符。
日文的Windows客户端使用AMERICAN_AMERICA.JA16SJIS将允许你存储或检索日文(如果NLS_CHARACTERSET也支持日文)
7. Microsoft Windows命令提示符中常用NLS_LANG的列表:
注意:这是命令提示符sqlplus 版本的正确设置 (sqlplus.exe/ plus80.exe / plus33.exe )
OEM并不支持所有的脚本/语言。
Microsoft Windows中OEM不支持下面的语言:
Armenian, Divehi, Georgian, Gujarati, Hindi, Kannada, Oriya, Konkani, Marathi, Punjabi, Sanskrit, Syriac, Tamil and Telugu. (此部分只为示例, 请参见本文档 3.1)
大多数命令提示符EM 代码页不支持Euro symbol (€)
操作系统Locale 命令提示符的NLS_LANG值
Arabic (U.A.E.) ARABIC_UNITED ARAB EMIRATES.AR8DOS720
Bulgarian BULGARIAN_BULGARIA.RU8PC866
Catalan CATALAN_CATALONIA.WE8PC850
Chinese (PRC) SIMPLIFIED CHINESE_CHINA.ZHS16GBK
Chinese (Taiwan) TRADITIONAL CHINESE_TAIWAN.ZHT16MSWIN950
Chinese (Hong Kong HKCS) TRADITIONAL CHINESE_HONG KONG.ZHT16HKSCS
Chinese (Hong Kong HKCS31) TRADITIONAL CHINESE_HONG KONG.ZHT16HKSCS31 (new in 10gR2)
HKSCS 只在Microsoft Windows 2000 和 XP上有, Vista 和 7没有,
参见 Document 787371.1 Oracle Database Server support for HKCSC 1999, 2001 and 2004 character sets.
Croatian CROATIAN_CROATIA.EE8PC852
Czech CZECH_CZECH REPUBLIC.EE8PC852
Danish DANISH_DENMARK.WE8PC850
Dutch (Belgium) DUTCH_BELGIUM.WE8PC850
Dutch (Netherlands) DUTCH_THE NETHERLANDS.WE8PC850
English (United Kingdom) ENGLISH_UNITED KINGDOM.WE8PC850
English (United States) AMERICAN_AMERICA.US8PC437
Estonian ESTONIAN_ESTONIA.BLT8PC775
Finnish FINNISH_FINLAND.WE8PC850
French (Canada) CANADIAN FRENCH_CANADA.WE8PC850
French (France) FRENCH_FRANCE.WE8PC850
German (Germany) GERMAN_GERMANY.WE8PC850
Greek GREEK_GREECE.EL8PC737
Hebrew HEBREW_ISRAEL.IW8PC1507
Hungarian HUNGARIAN_HUNGARY.EE8PC852
Icelandic ICELANDIC_ICELAND.WE8PC850
Indonesian INDONESIAN_INDONESIA.WE8PC850
Italian ITALIAN_ITALY.WE8PC850
Japanese JAPANESE_JAPAN.JA16SJIS
Korean KOREAN_KOREA.KO16MSWIN949
Latvian LATVIAN_LATVIA.BLT8PC775
Lithuanian LITHUANIAN_LITHUANIA.BLT8PC775
Norwegian NORWEGIAN_NORWAY.WE8PC850
Polish POLISH_POLAND.EE8PC852
Portuguese (Brazil) BRAZILIAN PORTUGUESE_BRAZIL.WE8PC850
Portuguese (Portugal) PORTUGUESE_PORTUGAL.WE8PC850
Romanian ROMANIAN_ROMANIA.EE8PC852
Russian RUSSIAN_CIS.RU8PC866
Slovak SLOVAK_SLOVAKIA.EE8PC852
Spanish (Mexico) MEXICAN SPANISH_MEXICO.WE8PC850
Spanish (Spain) SPANISH_SPAIN.WE8PC850
Spanish (Venezuela) LATIN AMERICAN SPANISH_VENEZUELA.WE8PC850
Swedish SWEDISH_SWEDEN.WE8PC850
Thai THAI_THAILAND.TH8TISASCII
Turkish TURKISH_TURKEY.TR8PC857
Ukrainian UKRAINIAN_UKRAINE.RU8PC866
Vietnamese VIETNAMESE_VIETNAM.VN8MSWIN1258
8. Windows上为Unicode应用程序设置正确的NLS_LANG:
支持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/en-us/library/dd374081(VS.85).aspx
Windows上有些连接方式同NLS_LANG的设置无关,比如:
- Oracle ODBC / OLE 驱动不使用NLS_LANG来做Unicode调用的转换。参见文档:"OCI Unicode binding and defining features are used by the ODBC and OLE DB drivers to handle Unicode data. OCI Unicode data binding and defining features are independent from NLS_LANG. This means Unicode data is handled properly, irrespective of the NLS_LANG setting on the platform."
- Oracle Thin JDBC 驱动也不使用NLS_LANG,一个使用thin JDBC的例子就是Oracle SQL Developer,这里可以下载http://www.oracle/technetwork/developer-tools/sql-developer
- Oracle 10g及以上版本的Thick JDBC 驱动同样默认不使用NLS_LANG,而使用JVM locale中的Language, Territory及characterset。参见文档note 115001.1 NLS_LANG Client Settings and JDBC Drivers
9. Windows如何使用字体来显示不同的字符集:
假设您有一个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字符集的数据库中看到上述情形。
10. 更新/更改注册表中的NLS_LANG为正确的值:
例如可以通过导入.reg文件,它将删除旧的插入新的注册表值
如:
REGEDIT4
[HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\]
"NLS_LANG"=-
[HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0]
"NLS_LANG"=-
"NLS_LANG"="DUTCH_BELGIUM.WE8MSWIN1252"
参考
NOTE:199926.1 - How to change the ANSI Code Page (ACP) on Windows NT 4.0 and Windows 2000 / XP
本文标签: 正确 文档 环境 Microsoft Windows
版权声明:本文标题:Microsoft Windows 环境中NLS_LANG的正确设置 (文档 ID 1577370.1) 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1726194585h913727.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论