oracle 客户端与服务器端字符集原理(转自totozlj)

 

1、环境假设:

名词解释:应用程序页面即用户在浏览器中看到的页面,一般程序员在写页面的时候都会在页面中设置编码,这个编码也即是数据在浏览器到web服务器间传输的编码,如果不设置则默认iso-8859的编码,此编码不支持中文。

一般来讲j2ee项目的页面都会有很多,现取两个页面来做解释,分别为页面1,页面2,页面1编码为UTF-8,页面2编码为GBK。

oracle的客户端配置内容如下:

SQL> select * from nls_instance_parameters;

PARAMETER VALUE
-------------------------------------------------- --------------------------------------------------
NLS_LANGUAGE SIMPLIFIED CHINESE
NLS_TERRITORY CHINA

数据库字符集内容如下:

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

PARAMETER VALUE
-------------------------------------------------- --------------------------------------------------
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.1.0.6.0

LINUX下的LANG=zh_CN.UTF-8

2、问题:用户操作:页面1中输入中文"中国",页面2中输入中文"中国",这个时候问题出现了,在页面1中查看页面2的输入的中文记录为乱码,在页面2中查看页面1中输入的中文记录为乱码。

3、问题解析:

oracle是这样来存储数据的,当数据经过浏览器传送过来的时候,oracle数据库首先询问oracle客户端,问这个数据是什么编码,然后oracle客户端去检查nls_lang环境变量,如果此环境变量没有配置,则默认使用数据库字符集,在这里就是AL32UTF8,如果配置了则oracle客户端会告诉oracle数据库nls_lang的值,在此假设中没有设置nls_lang环境变量,所以oracle客户端会默认使用数据库字符集即AL32UTF8,页面1中的中国是使用utf-8编码传送到数据库的,所以oracle客户端告诉oracle数据库端使用AL32UTF8编码存储此数据,此编码和数据库字符集一致,所以数据库无需转码直接存储,查询的时候也是直接查出来无需转码,所以数据从数据库到页面都是使用utf-8传过来的,而真正到页面2的时候却发现页面2使用的是GBK编码,此时出现乱码。页面1中查看页面2输入的内容也是这种情况。

4、总结:

oracle客户端字符集最好和数据库端字符集相一致,这样可以省却数据在数据库中的一个转码过程,提高数据库性能。

在oracle中设置好客户端字符集和数据库端字符集现在看来只能省却数据库转码的过程,其他的还没发现。

客户端字符集和web服务器现在看来没有什么关系,只和页面中的编码设置有关,web服务器只不过是一个数据的中转站而已。

而数据库服务器linux的编码只和scrt这种终端连接的中文显示有关,和应用程序数据编码无关。如linux的LANG=zh_CN.UTF-8则scrt可以显示中文,若是别的不支持中文的编码,则不能正常显示中文。

参考文章:http://blog.csdn.net/nini1109/article/details/4158796

http://www.oschina.net/question/234345_51169

http://hi.baidu.com/wwcs_new/item/69af38448c02f416886d1067

http://xiangqinghu1988.blog.163.com/blog/static/58822991201222231517193/

http://www.cnblogs.com/kelin1314/archive/2011/01/21/1940986.html

http://yangzb.iteye.com/blog/255769

http://blog.csdn.net/woods2001/article/details/7238690

http://jelly.iteye.com/blog/654300

http://xuejianxinokok.blog.163.com/blog/static/40437577201212332037607/

http://jelly.iteye.com/blog/654300

http://www.cnblogs.com/dongzhiquan/archive/2012/06/26/2564134.html

 
 
分类: ORACLE
posted @ 2016-08-10 17:04  Mr.MoonLiu  阅读(418)  评论(0编辑  收藏  举报