Setting NLS_LANG Value for Oracle
Introduction
Many times, when you have an Oracle application and you have to support special characters like ö,ä,ü,é,è
or currency symbols (e.g. €
), you encounter problems with proper display. Mostly, this problem is caused by improper setting of NLS_LANG
value.
NLS_LANG
sets the language and territory used by the client application and the database server. It also sets the client's character set, which is the character set for data entered or displayed by a client program.
Character Set of Database
When an Oracle Database is created, the DBA has to specify the CHARACTER SET
and the NATIONAL CHARACTER SET
.
Nowadays, the default values are:
AL32UTF8
forCHARACTER SET
andAL16UTF16
forNATIONAL CHARACTER SET
These Database character sets define which characters (in which format) can be stored in CHAR
, CLOB
, VARCHAR2
resp. in NCHAR
, NCLOB
, NVARCHAR2
column. On an existing database, you can query the values with:
SELECT *
FROM NLS_DATABASE_PARAMETERS
WHERE PARAMETER LIKE '%CHARACTERSET'; PARAMETER VALUE
==========================================
NLS_CHARACTERSET AL32UTF8
NLS_NCHAR_CHARACTERSET AL16UTF16 2 row(s) selected.
The database character sets do not define if and how charaters are displayed in your client application!
Some Facts of NLS_LANG
Format of NLS_LANG
definition is NLS_LANG = LANGUAGE_TERRITORY.CHARSET
All components of the NLS_LANG
definition are optional; any item that is not specified uses its default value. If you specify territory or character set, then you must include the preceding delimiter [underscore (_
) for territory, period (.
) for character set]. Otherwise, the value is parsed as a language name.
Following definitions are all valid:
NLS_LANG=.WE8ISO8859P1
NLS_LANG=_GERMANY
NLS_LANG=AMERICAN
NLS_LANG=ITALIAN_.WE8MSWIN1252
NLS_LANG=_BELGIUM.US7ASCII
If NLS_LANG
value is not provided, then Oracle defaults it to AMERICAN_AMERICA.US7ASCII
.
LANGUAGE
and TERRITORY
set the default value for many other NLS Parameters, see this table to get an overview. CHARSET
is used to let Oracle know what character set you are using on the client side, so Oracle can do the proper conversion. Setting the LANGUAGE
and TERRITORY
parameters of NLS_LANG
has nothing to do with the ability to store characters in a database. Here, you see a list of available Languages, Territoriesand Character Sets.
You can change the language and territory of your session by:
ALTER SESSION SET NLS_LANGUAGE = '...';
respective
ALTER SESSION SET NLS_TERRITORY = '...';
However, you cannot change your client charset
with any SQL command, it is set only by the NLS_LANG
value.
Some setting can be explicitly set in SQL functions, for example:
SELECT TO_CHAR(SYSDATE, 'DD Month', 'NLS_DATE_LANGUAGE = FRENCH')
FROM dual;
other can not, e.g.:
SELECT TRUNC(SYSDATE, 'DY', 'NLS_TERRITORY = AMERICA') AS FIRST_DAY_OF_WEEK
FROM dual;
does not work.
You cannot query your client charset
by any dictionary or dynamic performance view or any other SQL command. Also, dictionary view NLS_SESSION_PARAMETERS
shows the database character set, not the clientcharacter set!
You can run query:
SELECT CLIENT_CHARSET
FROM V$SESSION_CONNECT_INFO;
However, the values appear not reliable. Sometimes, it shows NULL
or "unknown".
Definition of NLS_LANG
NLS_LANG
can be set by Environment
variable (e.g. SET NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252
) or by your Registry at HKEY_LOCAL_MACHINE\Software\Oracle\KEY_{ORACLE_HOME_NAME}\NLS_LANG
, resp. HKEY_LOCAL_MACHINE\Software\Wow6432Node\Oracle\KEY_{ORACLE_HOME_NAME}\NLS_LANG
for 32-bit Oracle Client on a 64-bit Windows. The Environment
variable takes precedence over Registry entry.
You can interrogate existing values with:
Windows: reg query HKEY_LOCAL_MACHINE\Software\Oracle\KEY_{ORACLE_HOME_NAME} /f NLS_LANG
reg query HKEY_LOCAL_MACHINE\Software\Wow6432Node\Oracle\KEY_{ORACLE_HOME_NAME} /f NLS_LANG
set NLS_LANG Unix/Linux: echo $NLS_LANG
Proper Value of NLS_LANG
Usually, the values for LANGUAGE
and TERRITORY
are obvious and less critical in the application. The most interesting is the CHARACTER SET
value. Many times, you read in forums (and sometimes even in official documentation): "The client NLS_LANG
character set must be the same value as the database character set" - This is simply not true! Consider the database has two character sets, the "normal" and the national character set. On the client side, you have only one value, so actually they cannot be equal. Some character sets are available only on Client side which also vindicates my statement.
There are two requirements for the NLS_LANG
character set:
- The NLS_LANG character set must support the characters you like to use in your application.
- The NLS_LANG character set must match the character set (or encoding) of your application.
Some applications/drivers load NLS_LANG
definition when at launch and derive their character set from NLS_LANG
value. In such case, it becomes easier and only the first requirement applies.
NLS_LANG with SQL*Plus
SQL*Plus inherits the character set from the terminal session where you started it. On Windows, you get the current character set (here called "Codepage
") with chcp
, the Linux/Unix equivalent is locale charmap
or echo $LANG
. Thus, a proper setting would be for example:
C:\>chcp
Active Codepage: 850. C:\>set NLS_LANG=.WE8PC850 C:\>sqlplus ...
With chcp
, you can also change your codepage, e.g., chcp 1252
. You can use the small batch file to change the codepage
of your command line window permanently:

@ECHO off SET ROOT_KEY="HKEY_CURRENT_USER" FOR /f "skip=2 tokens=3" %%i in _
('reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage /v OEMCP') do set OEMCP=%%i ECHO.
ECHO ...............................................
ECHO Select Codepage
ECHO ...............................................
ECHO.
ECHO 1 - CP1252
ECHO 2 - UTF-8
ECHO 3 - CP850
ECHO 4 - ISO-8859-1
ECHO 5 - ISO-8859-15
ECHO 6 - US-ASCII
ECHO.
ECHO 9 - Reset to System Default (CP%OEMCP%)
ECHO 0 - EXIT
ECHO. SET /P CP="Select a Codepage: " if %CP%==1 (
echo Set default Codepage to CP1252
reg add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "chcp 1252" /f
) else if %CP%==2 (
echo Set default Codepage to UTF-8
reg add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "chcp 65001" /f
) else if %CP%==3 (
echo Set default Codepage to CP850
reg add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "chcp 850" /f
) else if %CP%==4 (
echo Set default Codepage to ISO-8859-1
add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "chcp 28591" /f
) else if %CP%==5 (
echo Set default Codepage to ISO-8859-15
add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "chcp 28605" /f
) else if %CP%==5 (
echo Set default Codepage to ASCII
add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "chcp 20127" /f
) else if %CP%==9 (
echo Reset Codepage to System Default
reg delete "%ROOT_KEY%\Software\Microsoft\Command Processor" /v AutoRun /f
) else if %CP%==0 (
echo Bye
) else (
echo Invalid choice
pause
)
Note, the settings will apply only for the current user. If you like to set it for all users, replace line:
SET ROOT_KEY="HKEY_CURRENT_USER"
by:
SET ROOT_KEY="HKEY_LOCAL_MACHINE"
Be careful with codepage UTF-8 (chcp 65001
) there is a bug, see this discussion. I do not know whether this has been fixed in more recent Windows / SQL*Plus versions.
NLS_LANG with .sql Files
When you run sql files in SQL*Plus, check the save options of your editor. Typically, you can choose values like ISO-8859-1
, UTF-8
, ANSI
, CP1252
as encoding. Term "ANSI" denotes the default Windows code pages. On a western PC, this is CP1252
.
You can interrogate default Windows code pages with:
C:\>reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage /v ACP HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage
ACP REG_SZ 1252 C:\>
or read "ANSI Codepage" from this table National Language Support (NLS) API Reference for any locale.
You must set character set of NLS_LANG
according to the encoding of your text editor. Here is a list of available Code Pages.
NLS_LANG in Your .NET Application
- ODP.NET Managed Driver is not
NLS_LANG
sensitive.
It is only .NET locale sensitive. (See Data Provider for .NET Developer's Guide) - ODBC, ODP.NET and OLE DB providers from Oracle read
NLS_LANG
value when they are loaded and inherit the definition, resp. ensures proper character conversion for any client/database character setting. - ODBC, ADO.NET and OLE DB providers from Microsoft also read
NLS_LANG
value when they are loaded. However, they have some limitations, especially in terms of Unicode.
How to Determine the Character Set of My Application If Not Known?
First of all, you should consult the documentation of your application and used drivers.
I developed the following approach if you still have no clue about the used character set.
- Set your
NLS_LANG
toNLS_LANG=.AL32UTF8
- Connect with SQL*Plus to a database with UTF-8 support, i.e., character set
AL32UTF8
When the client character set is equal to the database character set, then no character conversion takes place and all bytes are transferred "as they are" - In your application, run a query with special character like this:
select dump('€') from dual; DUMP('€')
-----------------
Typ=96 Len=1: 164
Then you can estimate the character set with a function written in C# like this:
byte[] o = new byte[] { 164 };
foreach ( var enc in Encoding.GetEncodings() ) {
var convertedString = enc.GetEncoding().GetBytes("€");
if ( convertedString.SequenceEqual(o) )
Console.WriteLine(String.Format("{0}\t{1}\t{2}", enc.CodePage, enc.Name, enc.DisplayName));
}
The function will print a list of potential character sets used by your application. Sometimes, the printout gives you obviously used character set, sometimes you have to use more other special characters. Some Codepages differ only in a single character!
What To Do If My Characters Are Still Not Properly Displayed?
- Check carefully the documentation of your application and used drivers. Perhaps they are old and do not support Unicode yet. Make an update to the latest version of drivers.
- Check if your font supports desired characters. You can use for example this page Font Support for Unicode Characters to verify used fonts.
- Check the real content of your database. Run query like
SELECT DUMP(THE_COLUMN, 1016) FROM ...
to see the bytes in the table. Perhaps the data have been inserted by a client with wrongNLS_LANG
definition. Don't be scared, usually you have to investigate only a few characters/bytes to get a result.
参考文献
https://docs.oracle.com/html/B10131_02/gblsupp.htm
https://docs.oracle.com/cd/E12102_01/books/AnyInstAdm784/AnyInstAdmPreInstall18.html
https://www.unicode.org/wg2/iso10646/edition5/charts/iso10646-5th-CodeCharts.pdf
https://www.ibm.com/support/knowledgecenter/en/SS6QYM_9.2.0/com.ibm.help.install.doc/t_ConfiguringTheNLS_LANGParameterForAnOracleClient.html
转自:
https://www.codeproject.com/Tips/1068282/Setting-NLS-LANG-Value-for-Oracle
Setting NLS_LANG Value for Oracle的更多相关文章
- 【Oracle】详解Oracle中NLS_LANG变量的使用
目录结构: contents structure [+] 关于NLS_LANG参数 NSL_LANG常用的值 在MS-DOS模式和Batch模式中设置NLS_LANG 注册表中NLS_LANG和系统环 ...
- [转帖]【Oracle】详解Oracle中NLS_LANG变量的使用
[Oracle]详解Oracle中NLS_LANG变量的使用 https://www.cnblogs.com/HDK2016/p/6880560.html NLS_LANG=LANGUAGE_TERR ...
- Oracle 客户端 NLS_LANG 的设置(转)
1. NLS_LANG 参数组成NLS_LANG参数由以下部分组成:NLS_LANG=<Language>_<Territory>.<Clients Characters ...
- vmware workstation9.0 RHEL5.8 oracle 10g RAC安装指南及问题总结
一,虚拟机规划 (1)虚拟机:添加三块网卡 eth0 eth1 eth2 ,分别用于内网,心跳,外网RAC1 内网:192.168.1.10/24 心跳:192.168.2.10/24 VIP:1 ...
- Oracle安装前用户信息设置
如果是重复安装,首先需要清除已经存在的软件安装记录: rm -fr /usr/local/bin/*oraenv rm -fr /usr/local/bin/dbhome rm -fr /usr/tm ...
- Globalization Guide for Oracle Applications Release 12
Section 1: Overview Section 2: Installing Section 3: Configuring Section 4: Maintaining Section 5: U ...
- spoolight on oracle 配置
spoolight seting 1ORACLE_HOME=D:\oracle\product\11.2.0\client_1set SQLPATH=D:\oracle\product\11.2.0\ ...
- Oracle 11g RAC for LINUX rhel 6.X silent install(静默安装)
一.前期规划 1.硬件环境 CPU: Intel(R) Xeon(R) CPU E7-4820 v4 @ 2.00GHz 8*10核 内存:512GB OCR:2147*5 MB DATA1:2TB ...
- Linux环境下Oracle安装参数设置
前面讲了虚拟机的设置和OracleLinux的安装,接下来我们来说下Oracle安装前的准备工作.1.系统信息查看系统信息查看首先服务器ip:192.168.8.120服务器系统:Oracle Lin ...
随机推荐
- CommonJs规范详解---【XUEBIG】
CommonJS是服务器模块的规范,Node.js采用了这个规范 1.CommonJs规范的出发点:JS没有模块系统.标准库较少.缺乏包管理工具:为了让JS可以在任何地方运行,以达到Java.C ...
- 潭州课堂25班:Ph201805201 tornado 项目 第八课 增加喜欢功能(课堂笔记)
tornado 相关说明 新增一个页面,用来做图片收藏, 还要在 account.py 创建一个数据库表,记录用户喜欢的图片,哪些图片用户疯狂传奇 cd 到 项目目录下,执行数据库更新 alembic ...
- 潭州课堂25班:Ph201805201 tornado 项目 第五课 增加用户系统-用户中心(课堂笔记)
tornado 相关说明 在 users 表中创建记录,做测试 在项目根目录下创建 test.py # -*- coding: utf-8 -*- # 斌彬电脑 # @Time : 2019/2/27 ...
- S0.0 计算机如何看东西
标签(空格分隔):数字图像处理 opencv 当我们用特定软件打开一张图片或者更改某些位图的格式为txt时,就会发现图像的本质不过就是一堆数据罢了. 采样 我们可以用相机采样到一幅二维图像,图像的分辨 ...
- VIM编辑器用法
Vim (vim + filename有则进入文件,无则创建并进入文件)>进入编辑模式,包括命令模式.插入模式.末行模式,具体命令: 按esc进入命令模式 按'shift' + ':'进入末行模 ...
- webpack 安装 打包
一, 下载node.js https://nodejs.org/zh-cn/ 二, //全局安装 npm install -g webpack //npm init 刷新webpack.json 文 ...
- crawlspider
Scrapy中CrawSpider 回头看: 之前的代码中,我们有很大一部分时间在寻找下一页的url地址或者是内容的url地址或者是内容的url地址上面,这个过程能更简单一些么? 思路: 1. 从re ...
- Linux下批量修改后缀名
1.用find和xargs添加后缀名 [root@node99 yum.repos.d]# ls -ltr total 32 -rw-r--r--. 1 root root 5701 Nov 23 2 ...
- rabbit_mq实现分布式事务
gitlab下载地址: 一.rabbitmq实现原理 一般在自己内部系统中建议采用lcn刚性事务来处理,面对调用第三方接口,或者夸平台语言是采用消息中间来实现补偿型事务.注意在进行补偿时需要注意重复调 ...
- pc端 页面 显示在手机 一行控制适配问题
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">