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

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

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

    转载自http://www.cnblogs.com/lys_013/archive/2012/05/05/2484561.html 1. 协议 a. TCP/IP整体构架概述 TCP/IP协议并不完全 ...

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

    1. 协议 a. TCP/IP整体构架概述 TCP/IP协议并不完全符合OSI的七层参考模型.传统的开放式系统互连参考模型,是一种通信协议的7层抽象的参考模型,其中每一层执行某一特定任务.该模型的目的 ...

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

    原文链接: https://www.iteye.com/topic/470019 1. 协议 a. TCP/IP整体构架概述 TCP/IP协议并不完全符合OSI的七层参考模型.传统的开放式系统互连参考 ...

  4. Oracle客户端与服务器字符集不统一的处理

    当Oracle客户端与服务器的字符集不统一时. 症状: 如:ORA-00283: ?????????? 提示信息中有好多问号. 解决方法: 1查询服务器的字符集: SQL> conn / as ...

  5. Oracle 客户端注册表字符集修改-----解决乱码 .

    本地ORACLE连接创建好后,默认是GBK的字符集,如果连接服务器不是同样的GBK字符集就会出现中文乱码的问题,这种情况我们需要修改本地的字符集来和服务器匹配. 通过注册表修改   HKEY_LOCA ...

  6. oracle客户端plsql设置字符集

    感谢一个新朋友的到来,我帮他的过程中有好些东西都不怎么想的起来了,所以从现在起我需要记录下每一点一滴, 因为我觉得写下来的东西才不会丢,而且欢迎以后的朋友到来. 使用plsql查数据的时候有时候中文会 ...

  7. Oracle客户端的安装与远程连接配置

    在继续Oracle客户端的安装之前,需要分析一下Oracle客户端与数据库服务器之间的连接机制. 一.Oracle客户端与服务器端的通讯机制 1.Oracle Net协议 如下图所示,Oracle通过 ...

  8. 不安装Oracle客户端使用PL/SQL连接服务器端Oracle

    从10G开始,Oracle 提供了一个较为轻量级的客户包,叫做Instant Client Package. 将它安装好后,就不用再安装庞大的Oracle客户端,可以直接通过使用PL/SQL连接服务器 ...

  9. [转]sqlldr 导入乱码,Oracle客户端字符集问题

    1,查Oracle数据库创建时候的字符集:oracle服务器端执行 SQL> select name, value$ from sys.props$ where name like 'NLS%' ...

随机推荐

  1. 第11.5节 Python正则表达式搜索任意字符匹配及元字符“.”(点)功能介绍

    在re模块中,任意字符匹配使用"."(点)来表示, 在默认模式下,点匹配除了换行的任意字符.如果指定了搜索标记re.DOTALL ,它将匹配包括换行符的任意字符.关于搜索标记的含义 ...

  2. PyQt(Python+Qt)学习随笔:QTreeWidget树型部件中的QTreeWidgetItem项构造方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTreeWidget树型部件的项是单独的类对象,这个类就是QTreeWidgetItem. QTr ...

  3. PyQt学习随笔:Model和View之间的数据互动过程

    在<PyQt学习随笔:Qt中tem Views(Model-Based)和Item Widgets(Item-Based)控件的用途和关系>中介绍了,Model用于存储数据,View用于展 ...

  4. PyQt(Python+Qt)学习随笔:QAbstractItemView的textElideMode属性

    老猿Python博文目录 老猿Python博客地址 一.概述 textElideMode属性用于控制省略文本中省略号"-"的位置,当项的内容过多视图无法显示完整时会显示部分内容,并 ...

  5. 第15.10节 PyQt(Python+Qt)入门学习:Qt Designer可视化设计界面组件与QWidget类相关的组件属性详解

    PyQt学习有阵子了,对章节的骨架基本考虑好了,准备本节就写组件的属性的,结果一是日常工作繁忙,经常晚上还要加班,二是Qt的组件属性很多,只能逐一学习.研究和整理,花的时间有点长,不过终于将可视化设计 ...

  6. Java基础学习之异常处理(6)

    @ 目录 1.异常是什么 1.1.Error 1.2.Exception 2.异常处理机制 2.1.捕获异常 2.2.抛出异常 3.自定义异常 3.1.自定义检查性异常 3.2.自定义运行时异常 1. ...

  7. 百度前端技术学院-基础-day17-18

    JavaScript小练习 task 1 基于上一个任务中,关于加减乘除的任务,加上对于特殊情况的判断,比如判断两个输入框是否都是正常输入了数字类型的内容,比如除法的时候除数是否为0,当判断到输入有异 ...

  8. NOI Online #1 入门组 魔法

    全网都是矩阵快速幂,我只会倍增DP 其实这题与 AcWing 345. 牛站 还是比较像的,那题可以矩阵快速幂 / 倍增,这题也行. 先 \(Floyd\) 预处理两点之间不用魔法最短距离 \(d_{ ...

  9. Hadoop框架:Yarn基本结构和运行原理

    本文源码:GitHub·点这里 || GitEE·点这里 一.Yarn基本结构 Hadoop三大核心组件:分布式文件系统HDFS.分布式计算框架MapReduce,分布式集群资源调度框架Yarn.Ya ...

  10. centos7下安装iostat命令

    [root@node01 yum.repos.d]# yum intall -y sysstat Loaded plugins: fastestmirror No such command: inta ...