论Oracle字符集“转码”过程
本文将通过实验来演示一下Oracle字符集“转码”的确认过程。
1.实验环境说明
客户端是Windows XP操作系统的SQL*Plus程序,客户端字符集是936(对应Oracle的ZHS16GBK字符集);
数据库版本是Oracle 10g,数据库字符集是AL32UTF8;
NLS_LANG参数将在实验中进行指定。
1)确认客户端字符集
C:\>chcp
活动代码页: 936
注释:936对应Oracle的ZHS16GBK字符集。
2)查看数据库版本信息:
sec@ora10g> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bi
PL/SQL Release 10.2.0.3.0 - Production
CORE 10.2.0.3.0 Production
TNS for Linux: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production
3)确认数据库的字符集:
sec@ora10g> col PARAMETER for a20
sec@ora10g>
col value
for a20
sec@ora10g>
select *
from v$nls_parameters where parameter = 'NLS_CHARACTERSET';
PARAMETER
VALUE
-------------------- --------------------
NLS_CHARACTERSET AL32UTF8
2.实验中将会涉及到的两种场景
“转码”场景:设置客户端的NLS_LANG与客户端字符集一致,这里是ZHS16GBK;
“非转码”场景:设置客户端的NLS_LANG与数据库服务器端字符集一致,此处是AL32UTF8.
3.创建实验表T
sec@ora10g> create table t (x number(1), client_characterset varchar2(10),
nls_lang varchar2(10), database_characterset varchar2(10), y varchar2(10));
Table
created.
sec@ora10g> desc t;
Name
Null? Type
----------------------------------- -------- ------------------------
X
NUMBER(1)
CLIENT_CHARACTERSET
VARCHAR2(10)
NLS_LANG
VARCHAR2(10)
DATABASE_CHARACTERSET
VARCHAR2(10)
Y
VARCHAR2(10)
T表包含五个字段,分表表示序号、客户端字符集、客户端NLS_LANG设置情况以及数据库服务器字符集设置情况。
4.两种NLS_LANG设置方法下分别插入一条数据
1)当客户端的NLS_LANG设置为ZHS16GBK时,我们插入第一条记录(“转码”场景)。
C:\>set
nls_lang=AMERICAN_AMERICA.ZHS16GBK
C:\>sqlplus zj/zj@orcl
SQL*Plus: Release 10.2.0.3.0 - Production on Fri Feb 5 19:21:31
2010
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning and Data Mining options
sec@ora10g> insert into t values (1,'ZHS16GBK','ZHS16GBK','AL32UTF8','圣');
1 row
created.
sec@ora10g> commit;
Commit complete.
2)当客户端的NLS_LANG设置为AL32UTF8时,我们插入第二条记录(“非转码”场景)。
C:\>set
nls_lang=AMERICAN_AMERICA.AL32UTF8
C:\>sqlplus
zj/zj@orcl
SQL*Plus: Release 10.2.0.3.0 - Production on Fri Feb 5 20:41:15
2010
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning and Data Mining options
sec@ora10g> insert into t values (2,'ZHS16GBK','AL32UTF8','AL32UTF8','圣');
1 row created.
sec@ora10g> commit;
Commit complete.
5.两种NLS_LANG设置方法下分别查看刚刚插入的两条数据
1)当客户端的NLS_LANG设置为ZHS16GBK时(“转码”场景)。
sec@ora10g> col x for 9
sec@ora10g> col CLIENT_CHARACTERSET for a8
sec@ora10g> col NLS_LANG for a8
sec@ora10g> col DATABASE_CHARACTERSET for a8
sec@ora10g> col y for a4
sec@ora10g> col dump for a50
sec@ora10g> select t.*,dump(y,1016) dump from t order by 1;
X CLIENT_C NLS_LANG DATABASE
Y DUMP
-- -------- -------- -------- ----
--------------------------------------------------
1 ZHS16GBK ZHS16GBK AL32UTF8 圣 Typ=1 Len=3 CharacterSet=AL32UTF8: e5,9c,a3
2 ZHS16GBK AL32UTF8 AL32UTF8 ? Typ=1 Len=2 CharacterSet=AL32UTF8: ca,a5
2)当客户端的NLS_LANG设置为AL32UTF8时(“非转码”场景)。
sec@ora10g> col x for 9
sec@ora10g> col CLIENT_CHARACTERSET for a8
sec@ora10g> col NLS_LANG for a8
sec@ora10g> col DATABASE_CHARACTERSET for a8
sec@ora10g> col y for a4
sec@ora10g> col dump for a50
sec@ora10g> select t.*,dump(y,1016) dump from t order by 1;
X CLIENT_C NLS_LANG DATABASE
Y DUMP
-- -------- -------- -------- ----
--------------------------------------------------
1 ZHS16GBK ZHS16GBK AL32UTF8 鍦? Typ=1 Len=3 CharacterSet=AL32UTF8: e5,9c,a3
2 ZHS16GBK AL32UTF8 AL32UTF8 圣 Typ=1 Len=2 CharacterSet=AL32UTF8: ca,a5
实验结论
1)如果有可能,尽量保证客户端编码(Windows XP的cmd工具可以使用chcp命令来确认)、NLS_LANG参数和数据库字符集这三个内容一致,这样设置,无论是从性能上,还是从防止编码转换上都是最佳的;
2)如果目的是支持中文,数据库Server端的字符集应该尽量选择ZHS16GBK或AL32UTF8字符集,这样可以减少因不当的“转码”导致的字符乱码故障;
3)(推荐)可已将NLS_LANG参数与操作终端字符编码一致,这样可以保证数据库能正确获得应用终端使用的编码,这时会发生“编码转换”,但是,这样就可以保证正确转码,可以防止错误的编码存入数据库;
论Oracle字符集“转码”过程的更多相关文章
- ORACLE字符集基础知识
概念描叙 ORACLE数据库有国家字符集(national character set)与数据库字符集(database character set)之分.两者都是在创建数据库时需要设置的.国家 ...
- Oracle字符集的查看查询和Oracle字符集的设置修改
本文主要讨论以下几个部分:如何查看查询oracle字符集. 修改设置字符集以及常见的oracle utf8字符集和oracle exp 字符集问题. 一.什么是Oracle字符集 Oracle字符集是 ...
- 如何修改Oracle字符集
一.什么是Oracle字符集 Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系.ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据.它使数据库 ...
- 转Oracle字符集问题总结
Oracle字符集问题总结 分类: Oracle2006-06-04 13:48 1298人阅读 评论(3) 收藏 举报 oracle数据库sqlcharacter存储insert 作者: vston ...
- (转)oracle字符集与汉字
Oracle与汉字问题与字符集 分类: oracle 2012-10-29 17:31 425人阅读 评论(0) 收藏 举报 Oracle字符集引起的几个问题,常见的就是汉字占多少个字节,其次就是字符 ...
- oracle字符集问题总结
在进行web开发和oracle安装的过程中经常有人对字符集搞不清楚,因此对此做一下总结. 1.第一个问题:字符集之间的区别是什么呢? 常见的字符集有:UTF-8和GBK (1)GBK字符集 G ...
- oracle 字符集
---- 在国内外大中型数据库管理系统中,把ORACLE作为数据库管理平台的用户比较多.ORACLE 不论是数据库管理能力还是安全性都是无可非议的,但是,它在汉字信息的显示方面着实给中国用户带来不少麻 ...
- Oracle 字符集的查看和修改
Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系.ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据.它使数据库工具,错误消息,排序次序,日期 ...
- Oracle 字符集的查看和修改 -转
一.什么是Oracle字符集 Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系.ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据.它使数据库 ...
随机推荐
- 学习SDAutoLayout第三方库的用法总结
---恢复内容开始--- 在做图文混排计算高度我觉得SDAutoLayout布局是最好用的第三方库了,这里学习SDAutoLayout用法总结一下 用法介绍: ) 方法名中带有“SpaceToView ...
- 用终端直接在桌面生成text文件
简单的两行命令: cd Desktop/ 按回车 touch 888.text 按回车就会在桌面生成名称为888的text文件 用途:做demo的时候可以加一个说明文档进去,这样下次可以很方便的查看
- VB.net 字符串 分割 及 重新倒序组装
''' <summary> ''' split with ">>>>" , and inverted order ''' </summar ...
- saltstack实战4--综合练习1
规范配置管理 实际工作中可能会有现网环境,基线环境,开发环境. 需要使用saltstack统一管理.机器多了,业务多了,可能配置文件存放的会比较乱,因此可以统一管理起来 我们可以再加2个目录,test ...
- PHP,单双引号的区别‘“”“”’
一.转义 单引号:只转义\'和\\,其他不转义 双引号:都转义 二.变量解析 单引号:无法解析变量(原样输出) 双引号:可以解析变量 三.速度 单引号:更快 双引号:要分析是否有变量,转义内容更多 结 ...
- webstorm卡、闪退以及win10中jdk配置【转】
原文地址:webstorm卡.闪退以及win10中jdk配置 今天 webstorm 突然一直处于 indexing 索引状态,然后就卡死,重装也无法解决. 搜了一下后,有人说使用 64 位客户端 ...
- PHP之自定义会话控制---使用文件处理
前三篇简单的总结了下会话控制和文件操作,这一篇说说会话控制的自定义处理方式.既然知道了文件的基本读写,而且在会话控制中,也有人提到,session数据可以保存到缓存或数据库中,实际上当然不会是直接利用 ...
- 第八章 jQuery与Ajax应用
Ajax(Asynchronous JavaScript and XML),异步JavaScript和XML,它实现的无刷新更新页面,能够进行异步提交. jQuery对Ajax进行了封装,最底层的是$ ...
- MDAC 在WINDOWS XP SP3 不能安装 的解决方法
MDAC 在WINDOWS XP SP3 不能安装 的解决方法 解决步骤如下: c:/windows/inf 下找出mdac.inf 然后点右键->安装.在弹出提示路径选取c:/windows/ ...
- DB2存储过程实现查询表数据,生成动态SQL,并执行
一.动态执行SQL PREPARE S1 FROM 'delete from test'; EXECUTE S1; 二.使用游标 DECLARE V_CURSOR CURSOR FOR SELECT ...