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 客户端与服务器端字符集原理(转自totozlj)的更多相关文章
- 浅析Java web程序之客户端和服务器端交互原理(转)
转载自http://www.cnblogs.com/lys_013/archive/2012/05/05/2484561.html 1. 协议 a. TCP/IP整体构架概述 TCP/IP协议并不完全 ...
- [转]HTTP报文接口及客户端和服务器端交互原理
1. 协议 a. TCP/IP整体构架概述 TCP/IP协议并不完全符合OSI的七层参考模型.传统的开放式系统互连参考模型,是一种通信协议的7层抽象的参考模型,其中每一层执行某一特定任务.该模型的目的 ...
- 浅析Java web程序之客户端和服务器端交互原理
原文链接: https://www.iteye.com/topic/470019 1. 协议 a. TCP/IP整体构架概述 TCP/IP协议并不完全符合OSI的七层参考模型.传统的开放式系统互连参考 ...
- Oracle客户端与服务器字符集不统一的处理
当Oracle客户端与服务器的字符集不统一时. 症状: 如:ORA-00283: ?????????? 提示信息中有好多问号. 解决方法: 1查询服务器的字符集: SQL> conn / as ...
- Oracle 客户端注册表字符集修改-----解决乱码 .
本地ORACLE连接创建好后,默认是GBK的字符集,如果连接服务器不是同样的GBK字符集就会出现中文乱码的问题,这种情况我们需要修改本地的字符集来和服务器匹配. 通过注册表修改 HKEY_LOCA ...
- oracle客户端plsql设置字符集
感谢一个新朋友的到来,我帮他的过程中有好些东西都不怎么想的起来了,所以从现在起我需要记录下每一点一滴, 因为我觉得写下来的东西才不会丢,而且欢迎以后的朋友到来. 使用plsql查数据的时候有时候中文会 ...
- Oracle客户端的安装与远程连接配置
在继续Oracle客户端的安装之前,需要分析一下Oracle客户端与数据库服务器之间的连接机制. 一.Oracle客户端与服务器端的通讯机制 1.Oracle Net协议 如下图所示,Oracle通过 ...
- 不安装Oracle客户端使用PL/SQL连接服务器端Oracle
从10G开始,Oracle 提供了一个较为轻量级的客户包,叫做Instant Client Package. 将它安装好后,就不用再安装庞大的Oracle客户端,可以直接通过使用PL/SQL连接服务器 ...
- [转]sqlldr 导入乱码,Oracle客户端字符集问题
1,查Oracle数据库创建时候的字符集:oracle服务器端执行 SQL> select name, value$ from sys.props$ where name like 'NLS%' ...
随机推荐
- PyQt(Python+Qt)学习随笔:QMainWindow的addDockWidget方法增加QDockWidget停靠窗到主窗口
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 DockWidget除了放在QMainWindow窗口内外,也可以放在 ...
- 第6章 Python中的动态可执行方法目录
第6.1节 Python代码编译 第6.2节 Python特色的动态可执行方法简介 第6.3节 Python动态执行之动态编译的compile函数 第6.4节 Python动态表达式计算:eval函数 ...
- PyQt(Python+Qt)学习随笔:QTreeWidgetItem项下的子项列表中增加子项的方法
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 追加子项 QTreeWidgetItem类型的项构建以后,可以通过addChild(QTreeWid ...
- Python匹配对象的groups、groupdict和group之间的关系
匹配对象的groups()方法返回一个包含所有参与匹配的子组(不含组0)的匹配到的搜索文本子串的元组,groupdict返回一个包含所有匹配到的命名组的组名为键值和命名组匹配到的搜索文本子串为值作为元 ...
- php 序列化键、值逃逸
转自https://www.cnblogs.com/wangtanzhi/p/12261610.html PHP反序列化的对象逃逸(很重要一点,引号的匹配是从左到右按字符串长度进行匹配) 任何具有一定 ...
- .NET 开源导入导出库 Magicodes.IE 2.5发布
今天我们发布了2.5版本,这当然也离不开大家对Magicodes.IE的支持,今天我也是跟往常一样列举了该版本一些重要的更新内容. 当然也要说一下,在这个版本中我们设计了全新的LOGO Excel导出 ...
- SA-IS学习笔记
Q:SA-IS 是什么玩意? A:一种 \(O(n)\) 求后缀数组的高科技. Q:为什么会有 SA-IS 这种算法? A:因为它是 \(O(n)\) 的,比倍增 \(O(n\log n)\) 快. ...
- 题解-[CEOI2017]Building Bridges
[CEOI2017]Building Bridges 有 \(n\) 个桥墩,高 \(h_i\) 重 \(w_i\).连接 \(i\) 和 \(j\) 消耗代价 \((h_i-h_j)^2\),用不到 ...
- 小米k30 pro刷国际版rom
时间:2020.8.20 最新的是miui12但是普遍反映耗电量巨大,所以还是刷miui11了. 知乎上有个教程:https://zhuanlan.zhihu.com/p/86160027 但是是针对 ...
- DG修改SYS用户密码(ORA-16810,ORA-01017)
修改主库PROD1密码后,查看configuration状态看到以下报错: [oracle@edgzrip1-PROD1 ~]$ dgmgrl sys/oracleDGMGRL for Linux: ...