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

时间: 2024-10-09 22:25:19

oracle 客户端与服务器端字符集原理(转自totozlj)的相关文章

浅析Java web程序之客户端和服务器端交互原理(转)

转载自http://www.cnblogs.com/lys_013/archive/2012/05/05/2484561.html 1. 协议 a. TCP/IP整体构架概述 TCP/IP协议并不完全符合OSI的七层参考模型.传统的开放式系统互连参考模型,是一种通信协议的7层抽象的参考模型,其中每一层执行某一特定任务. 该模型的目的是使各种硬件在相同的层次上相互通信.这7层是:物理层.数据链路层.网路层.传输层.话路层.表示层和应用层.而TCP/IP通讯协议采用 了4层的层级结构,每一层都呼叫它

[转]HTTP报文接口及客户端和服务器端交互原理

1. 协议 a. TCP/IP整体构架概述 TCP/IP协议并不完全符合OSI的七层参考模型.传统的开放式系统互连参考模型,是一种通信协议的7层抽象的参考模型,其中每一层执行某一特定任务.该模型的目的是使各种硬件在相同的层次上相互通信.这7层是:物理层.数据链路层.网路层.传输层.话路层.表示层和应用层.而TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求.这4层分别为: i. 应用层:应用程序间沟通的层,如超文本传送协议(HTTP).简单电子邮件传输(

window下修改Oracle客户端版的字符集

1.win+R,运行regedit,进入注册表编辑器. 2.修改NLS_LANG的字符集 路径 HKEY_LOCAL_MACHINE -> SOFTWARE -> WOW6432Node -> ORACLE -> KEY_OraClient11g_home1 右边找到NLS_LANG,查看字符集并修改.

浅析Java web程序之客户端和应用服务器端交互原理

最近一直在思考一个问题,为什么在用struts框架开发的时候FormBean都需要序列化,即实现java.io.Serializable接口,本着勤学好问的精神我Google了下对象序列化方面的文章,虽然大体了解了怎么做,但是还是没有搞清楚为什么要这样做:最后我想解决一个问题要找问题的根源和本质,于是从web程序客户端和服务器端交互的原理入手,终于找到了我要的答案. 1. 对象序列化是什么东东? 简单地说,Java对象列化就是要把内存中的Java对象保存下来(持久化),以便可以在网络上传输或今后

修改Windows中Oracle客户端字符集

1.cmd  进入dos界面 输入regedit  打开注册表. 2. 按照上图修改字符集. 注意: 查看字符集:Select userenv('language') from dual; 中文字符集:AMERICAN_AMERICA.ZHS16GBK 修改Windows中Oracle客户端字符集,布布扣,bubuko.com

客户端到服务器端的通信过程及原理

学习任何东西,我们只要搞清楚其原理,就会触类旁通.现在结和我所学,我想总结一下客户端到服务器端的通信过程.只有明白了原理,我们才会明白当我们程序开发过程中错误的问题会出现在那,才会更好的解决问题. 我们首先要了解一个概念性的词汇:Socket socket的英文原义是“孔”或“插座”.作为进程通信机制,取后一种意思.通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄.(其实就是两个程序通信用的.)socket非常类似于电话的插座.以一个电话网为例.电话的通话双方相当于相互通信的2个

Linux下更改oracle客户端字符集和服务端字符集

from:http://blog.csdn.net/chid/article/details/6166506 Linux 下更改 oracle 客户端字符集和服务端字符集 1.Linux 下更改 oracle 客户端字符集,即设置环境变量" NLS_LANG" 的值 查看客户端字符集,在终端下执行: echo $NLS_LANG 修改客户端字符集: sudo gedit /etc/environment 在environment 文件中增加以下内容: NLS_LANG="SI

zookeeper原理解析-客户端与服务器端交互

Zookeeper集群中server数量总是确定的,所以集群中的server交互采用比较可靠的bio长连接模型:不同于集群中sever间交互zookeeper客户端其实数量是未知的,为了提高zookeeper并发性能,zookeeper客户端与服务器端交互采用nio模型.下面我们主要来讲讲zookeeper的服务器端与客户端的交互.读者对nio不了解的话不妨抽点时间去了解下,对于一些nio框架如netty,mina再如一些web容器如tomcat,jetty底层都实现一套nio框架,对于实现ni

免安装Oracle客户端使用PL/SQL连接Oracle的2种方法

作者:netshuai  来源:博客园  发布时间:2009-10-23 09:19  阅读:171 次  原文链接   [收藏] 方法一: 大家都知道,用PL/SQL连接Oracle,是需要安装Oracle客户端软件的.有没要想过不安装Oracle客户端直接连接Oracle呢? 其实我一直想这样做,因为这个客户端实在太让人讨厌了!!!不但会安装一个JDK,而且还会把自己放在环境变量的最前面,会造成不小的麻烦. 其实我之前问过很多人的,但是他们都说一定需要安装Oracle客户端的.......直