【转自mos中文文章】Microsoft Windows 环境中NLS_LANG的正确设置

来源:互联网 发布:淘宝摄影接单 编辑:程序博客网 时间:2024/05/22 21:10

 

文档内容

 用途 适用范围 详细信息 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)。

详细信息

要调试显示问题 (当您看到奇怪的符号或字符,如 "?" , "¿" 或 "ÃÂ") 请首先使用 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 指定:
- 货币和数字格式
- 计算星期和天数的范围和惯例

客户端字符集(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参数优先级的解释)。

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.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),但是限制是只能在客户端程序支持这种配置的时候使用。

依赖于ANSI Win32 API的程序,如SQL*Plus (sqlplusW.exe),旧版本的Oracle Forms等等。不能设置NLS_LANG 为 UTF8 / AL32UTF8。

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.

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只有一个正确的值

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

在命令提示符使用命令行工具如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.com/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.com/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

1 0