NLS_LANG 设置

#
NLS_LANG 的构成为:NLS_LANG=<NLS_LANGUAGE>_<NLS_TERRITORY>.<clients characterset>

# linux 设置
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8

# windows 设置
set NLS_LANG=American_America.AL32UTF8

实验

[oracle@localhost ~]$ sqlplus '/as sysdba'

SQL*Plus: Release 11.2.0.4.0 Production on Fri Oct 30 08:15:23 2015

Copyright (c) 1982, 2013, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> drop table t3;

Table dropped.

SQL> 
SQL> create table t3 ( a char ( 4 char));

Table created.

SQL> insert into t3 values('中国航天');
insert into t3 values('中国航天')
                      *
ERROR at line 1:
ORA-12899: value too large for column "SYS"."T3"."A" (actual: 12, maximum: 4)


SQL> set lin 80 pages 200
SQL> col parameter for a35
SQL> col value for a35
SQL> select * from nls_database_parameters;

PARAMETER                           VALUE
----------------------------------- -----------------------------------
NLS_LANGUAGE                        AMERICAN
NLS_TERRITORY                       AMERICA
NLS_CURRENCY                        $
NLS_ISO_CURRENCY                    AMERICA
NLS_NUMERIC_CHARACTERS              .,
NLS_CHARACTERSET                    AL32UTF8
NLS_CALENDAR                        GREGORIAN
NLS_DATE_FORMAT                     DD-MON-RR
NLS_DATE_LANGUAGE                   AMERICAN
NLS_SORT                            BINARY
NLS_TIME_FORMAT                     HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT                DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT                  HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT             DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY                   $
NLS_COMP                            BINARY
NLS_LENGTH_SEMANTICS                BYTE
NLS_NCHAR_CONV_EXCP                 FALSE
NLS_NCHAR_CHARACTERSET              AL16UTF16
NLS_RDBMS_VERSION                   11.2.0.4.0

20 rows selected.

SQL> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
[oracle@localhost ~]$ 
[oracle@localhost ~]$ export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
[oracle@localhost ~]$ sqlplus '/as sysdba'

SQL*Plus: Release 11.2.0.4.0 Production on Fri Oct 30 08:20:26 2015

Copyright (c) 1982, 2013, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> insert into t3 values('中国航天');

1 row created.

SQL> select * from t3;

A
----------------
中国航天

SQL> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
[oracle@localhost ~]$ 
[oracle@localhost ~]$ echo $NLS_LANG
AMERICAN_AMERICA.AL32UTF8
[oracle@localhost ~]$

解释

NLS_LANG=<NLS_Language>_<NLS_Territory>.<clients characterset>

1. 设置 NLS_LANG 的目的是将客户端 OS 的字符集告诉 Oracle Database,让 Oracle 来判断在客户端和 Database 之间是否要做字符集转换。
2. clients characterset 不需要和数据库的 NLS_CHARACTERSET 相同,相同可能是正确的,但不一定总是正确的。
3. NLS_LANG 并不会修改客户端 OS 的字符集,它仅仅是让 Oracle 知道客户端正在使用的字符集,以便于 Oracle 做出合适的字符集转换。
4. LS_LANGUAGE 和 NLS_TERRITORY 与数据库能不能存储某个字符无关,但是LS_LANGUAGE 和 NLS_TERRITORY设置错误数据库将不允许存储某个字符。
   比如 NLS_LANG 设置为 JAPANESE_JAPAN.WE8MSWIN1252 将不允许存储日文,因为 WE8MSWIN1252 没有定义日语字符。

字符集

首先,明确两点:
1. 计算机只能处理二进制
2. 操作系统可以控制屏幕打印出各种符号
   有了如上两点认识,我们只需要将符号和数字做一个对应关系,这样当需要计算机处理的时候用数字,需要显示的时候由操作系统将数字转换成具体的符号,这样就解决了计算机不能存储符号的问题。
   每个符号有个对应的数字,字符多了就组成了字符集。
   由于计算机一开始美国发明的,他们国家的符号比较少,比如 ASCII 只有7位或者8位就,可以表示128或者256个符号,这样1个字节就够存储了,形成了单字节字符集。
   随着计算机的普及,其它国家也慢慢有了计算机,当然也得显示他们国家的符号,因此有了各种字符集,但是每个国家的符号多少不一样,因此字符集大小不一样,需要表示一个符号的大小也不一样,可能需要2个或者3个字节等。
   再到后来,全球普及了计算机,各个国家互联互通,你想用本国的字符集表示其他国家的符号可能不够用,因此需要一个能表示世界上所有国家符号的字符集,因此 unicode 出现了,它的目的就是字义世界上所有的符号。
   
字体:
   字体是由操作系统转换某个数字(字符集编码)为图形展示在屏幕上的,如果某个字体没有将你正在使用的操作系统的字符集全部包含,当你用这个字体打印一个不在这个字体里的符号时,将会遇到黑框之类的符号。


你可能感兴趣的:(NLS_LANG 设置)