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%' ...
随机推荐
- SQL注入WAF绕过姿势
(1)大小写绕过 此类绕过不经常使用,但是用的时候也不能忘了它,他原理是基于SQL语句不分大小写的,但过滤只过滤其中一种. 这里有道题 (2)替换关键字 这种情况下大小写转化无法绕过而且正则表达式会替 ...
- pandas 移动列的方法
import pandas as pd df = pd.DataFrame(np.random.randn(3,4),columns=['a','b','c','d']) k = df.pop(&qu ...
- golang omitempty 总结
golang omitempty 总结 在使用Golang的时候,不免会使用Json和结构体的相互转换,这时候常用的就是 json.Marshal和json.Unmarshal两个函数. 这时候在定义 ...
- 【CSP-S 2019】树的重心(重心的性质)
Description 给定一颗 \(n\) 个顶点的树 \(\text T\),共 \(n-1\) 次断边操作,每次将树分为两部分 \(\text T_1, \text T_2\),求: \[\su ...
- Codeforces Edu Round 57 A-D
A. Find Divisible 符合条件的区间一定可以选择\(l, l * 2\). 证明\(l * 2 <= r\) 假设存在一组解,\(x, x * d (l <= x <= ...
- Angular:管道和自定义管道
①管道的使用,更多管道在angular官网上有 <p>全部转为大写:{{'hahahah' | uppercase}}</p> <p>保留两位小数:{{1.4555 ...
- PCRE正则表达式语法
字符 描述 \ 将下一个字符标记为一个特殊字符,或一个原义字符,或一个向后引用,或一个八进制转义符.例如,"\n"匹配一个换行符. ^ 匹配输入字符串的开始位置. $ 匹配输入字符 ...
- python(iJmeter-master)接口测试程序部署实践
记录学习性能测试过程遇到的问题 环境 安装环境如下: Windows 10 1803 VMWare Workstation 15 Pro Centos Linux release 7.9.2009(c ...
- 移动 WEB 开发的布局方式 ---- 响应式布局
一.响应式简介 一个页面布局兼容了 PC端 ,iPad端 和 移动端 所谓的响应式就是页面中的布局会随着屏幕的大小变化发生了响应而做出不同的页面布局模型 特点: 响应式布局是不需要单独写移动端页面的 ...
- jmeter的一些知识目录
1.JDK安装及环境变量配置2.Jmeter安装及环境变量配置3.如何启动 jmeter 4.下载并安装mysql驱动5.创建JDBC连接池及配置6 .新建线程组及参数配置7.http默认请求及参数配 ...