#
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 出现了,它的目的就是字义世界上所有的符号。
字体:
字体是由操作系统转换某个数字(字符集编码)为图形展示在屏幕上的,如果某个字体没有将你正在使用的操作系统的字符集全部包含,当你用这个字体打印一个不在这个字体里的符号时,将会遇到黑框之类的符号。