如果客户端NLS_LANG与数据库字符集不同会发生转换,如果存在对应关系,则把相应二进制编码经过映射后传递给数据库; 如果不存在对应关系,则传递一个替换字符(不同平台的替换字符各不相同,最常见的替换字符是“?”)NLS_LANG字符集与操作系统字符集(或应用字符集)不同导致的乱码
(一)NLS_LANG与数据库字符集不同的情况
当客户端在WE8ISO8859P15字符集时,输入欧元符号€,这时客户端NLS_LANG和数据库端字符集不同但不发生字符集转换,客户端€符号编码是A4,在NLS_LANG字符集中A4对应“¤”,即换产生了错误映射。由于数据库字符集不同于NLS_LANG设置,这时发生字符转换,存入数据库的编码变成了C2A4,虽然同NLS_LANG进行了正确的转换,但是客户端录入的数据已经损坏或者丢失了。
(二)NLS_LANG与数据库字符集相同的情况
当NLS_LANG和数据库字符集设置相同都为UTF8时,客户端的欧元符号的编码A4就不会经过任何转换就插入到数据库中,而在UTF8的数据库中,A4代表的是一个非法字符。
实验1:
设置客户端字符集为US7ASCII
D:\>SET NLS_LANG=AMERICAN_AMERICA.US7ASCII
查看服务器字符集为US7ASCII
SQL> SELECT * FROM NLS_DATABASE_PARAMETERS;
PARAMETER VALUE
------------------------------ ----------------------------------------
NLS_CHARACTERSET US7ASCII
SQL> CREATE TABLE TEST (R1 VARCHAR2(10));
SQL> INSERT INTO TEST VALUES('东北');
SQL> SELECT * FROM TEST;
R1