• 网络学院
  • IT资讯
  • 操作系统
  • 网络技术
  • 软件应用
  • 办公软件
  • 编程技术
  • 网站架设
  • 数据库类
  • 平面设计
  • 多媒体类
  • 游戏资讯
  • 教学论文
  • 认证考试
Oracle数据库字符集问题解析(2)
  站点:
  • 首 页
  • 最新软件
  • 文章教程
  • 国内软件
  • 国外软件
  • 绿色软件
  • 源码下载
  • 字体下载
Oracle数据库字符集问题解析(2)
软件发布 Oracle数据库字符集问题解析(2)
网络软件 系统工具 应用软件 联络聊天 图形图像 多媒体类 行业软件 游戏娱乐 编程开发 安全相关 教育教学 数码软件 绿软下载
热门软件: QQ 瑞星 pplive e话通 木马克星 千千静听 office2000 五笔字根 Photoshop 视频分割
返回文章教程首页 >> 文章首页 >> 认证考试 >> Oracle认证 >> Oracle指导 >> Oracle数据库字符集问题解析(2)

Oracle数据库字符集问题解析(2)

添加时间: 2008-4-19 22:03:57  作者:   阅读次数:6   来源:

       

实验结果分析二 

quote: 
--------------------------------------------------------------------------------
[ 更改客户端字符集为ZHS16GBK
D:>SET NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
D:>SQLPLUS "/ AS SYSDBA"
无法正常显示数据
SQL> SELECT * FROM TEST;
R1
--------------------
6+11
疑问1:ZHS16GBK为US7ASCII的超集,为什么在ZHS16GBK环境下无法正常显示 

--------------------------------------------------------------------------------
 
这主要是因为Oracle 检查 发现数据库设置的字符集与客户端配置字符集不同,它将对数据进行字符集的转换。数据库中实际存放的数据为182(10110110)、171(10101011)、177(10110001)、177(10110001),由于数据库字符集设置为US7ASCII,它是一个7bit的字符集,存储在8bit的字节中,则Oracle忽略各字节的最高bit,则182(10110110)就变成了54(0110110),在ZHS16GBK中代表数字符号“6”(当然在其它字符集中也是“6”),同样过程也发生在其它3个字节,这样“东北”就变成了“6+11”。
实验结果分析三 

quote: 
--------------------------------------------------------------------------------
最初由 tellin 发布
用ZHS16GBK插入数据
SQL> INSERT INTO TEST VALUES(’东北’);
1 row created.
SQL> SELECT * FROM TEST;
R1
--------------------
6+11
??
SQL> EXIT
--------------------------------------------------------------------------------

当客户端字符集设置为ZHS16GBK后向数据库插入“东北”,Oracle检查发现数据库设置的字符集为US7ASCII与客户端不一致,需要进行转换,但字符集ZHS16GBK中的“东北”两字在US7ASCII中没有对应的字符,所以Oracle用统一的“替换字符”插入数据库,在这里为“?”,编码为63(00111111),这时,输入的信息实际上已经丢失,不管字符集设置如何改变(如下面引用的实验结果),第二行SELECT出来的结果也都是两个“?”号(注意是2个,而不是4个)。

quote: 
--------------------------------------------------------------------------------
更改客户端字符集为US7ASCII 
D:>SET NLS_LANG=AMERICAN_AMERICA.US7ASCII
D:>SQLPLUS "/ AS SYSDBA"
无法显示用ZHS16GBK插入的字符集,但可以显示用US7ASCII插入的字符集
SQL> SELECT * FROM TEST;
R1
----------
东北
??

更改服务器字符集为ZHS16GBK
SQL> update props$ set value$=’ZHS16GBK’ WHERE NAME=’NLS_CHARACTERSET’;
1 row updated.
SQL> COMMIT;
更改客户端字符集为ZHS16GBK
D:>SET NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
D:>SQLPLUS "/ AS SYSDBA"
可以显示以前US7ASCII的字符集,但无法显示用ZHS16GBK插入的数据,说明用ZHS16GBK插入的数据为乱码。
SQL> SELECT * FROM TEST;
R1
--------------------
东北
??
--------------------------------------------------------------------------------

需要指出的是,通过“update props$ set value$=’ZHS16GBK’ WHERE NAME=’NLS_CHARACTERSET’;”来修改数据库字符集是非常规作法,很可能引起问题,在这里只是原文引用网友的实验结果。 
 
实验结果分析四 

quote: 
--------------------------------------------------------------------------------
SQL> INSERT INTO TEST VALUES(’东北’);
1 row created.
SQL> SELECT * FROM TEST;
R1
--------------------
东北
??
东北
SQL> EXIT
--------------------------------------------------------------------------------

由于此时数据库与客户端的字符集设置均为ZHS16GBK,所以不会发生字符集的转换,第一行与第三行数据显示正确,而第二行由于存储的数据就是63(00111111),所以显示的是“?”号。

quote: 
--------------------------------------------------------------------------------
  

更改客户端字符集为US7ASCII
D:>SET NLS_LANG=AMERICAN_AMERICA.US7ASCII
D:>SQLPLUS "/ AS SYSDBA"
无法显示数据
SQL> SELECT * FROM TEST;
R1
----------
??
??
??
疑问2:第一行数据是用US7ASCII环境插入的,为何无法正常显示? 
--------------------------------------------------------------------------------

将客户端字符集设置改为US7ASCII后进行SELECT,Oracle 检查 发现数据库设置的字符集为ZHS16GBK,数据需要进行字符集转换,而第一行与第三行的汉字“东”与“北”在客户端字符集US7ASCII中没有对应字符,所以转换为“替换字符”(“?”),而第二行数据在数据库中存的本来就是两个“?”号,所以虽然在客户端显示的三行都是两个“?”号,但在数据库中存储的内容却是不同的。
实验结果分析五 

quote: 
--------------------------------------------------------------------------------

SQL> INSERT INTO TEST VALUES(’东北’);
1 row created.
SQL> EXIT
更改客户端字符集为ZHS16GBK
D:>SET NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
D:>SQLPLUS "/ AS SYSDBA"
无法显示用US7ASCII插入的字符集,但可以显示用ZHS16GBK插入的字符集
SQL> SELECT * FROM TEST;
R1
--------------------
东北
??
东北
6+11
SQL>
疑问3:US7ASCII为ZHS16GBK的子集,为何在US7ASCII环境下插入的数据无法显示? [/B] 
--------------------------------------------------------------------------------

在客户端字符集设置为US7ASCII时,向字符集为ZHS16GBK的数据库中插入“东北”,需要进行字符转换,“东北”的ZHS16GBK编码为182(10110110)、171(10101011)与177(10110001)、177(10110001),由于US7ASCII为7bit编码,Oracle将这两个汉字当作四个字符,并忽略各字节的最高位,从而存入数据库的编码就变成了54(00110110)、43(00101011)与49(00110001)、49(00110001),也就是“6+11”,原始信息被改变了。这时,将客户端字符集设置为ZHS16GBK再进行SELECT,数据库中的信息不需要改变传到客户端,第一、三行由于存入的信息没有改变能显示“东北”,而第二、四行由于插入数据时信息改变,所以不能显示原有信息了。
 
分析了这么多的内容,但实际上总结起来也很简单,要想在字符集方面少些错误与麻烦,需要坚持两条基本原则:
在数据库端:选择需要的字符集(通过create database中的CHARACTER SET与NATIONAL CHARACTER SET子句指定);
在客户端:设置操作系统实际使用的字符集(通过环境变量NLS_LANG设置)。

例如:
CHARACTER SET ZHS16GBK
NATIONAL CHARACTER SET AL16UTF16

 

上下文章:

 

上一篇文章: ORACLE数据库常见问题诊断方法(2) 下一篇文章: Oracle PL/SQL语言基础1

相关文章:

  • 解瘳Vista系统OpenGL驱动问题整理
  • Vista下光盘刻录Nero 8常见问题
  • 在ORACLE的存储过程中如何做简单的动态查询
  • Oracle下调数据库许可价格以适应多芯CPU
  • Oracle全球客户支持副总裁汤姆·舒尔滋演讲

相关软件:

  • 高中数学问题处理系统 V1.2
  • Access数据库密码破解器 V2.65
  • dbguide 数据库管理专家 V1.3.0.0
  • 网际数据库浏览器 3.0.52
  • NeoExam考试系统 大众版/ACCESS数据库 1.0.8
  • NeoExam考试系统 VIP版/ACCESS数据库 1.0.8

 

快速导航

  • 网络学院
  • 精品汇聚
  • 字体下载
  • 教程下载
  • ASP源码
  • PHP源码
  • Net源码
  • JSP 源码

Oracle认证分类导航

  • Oracle动态
  • Oracle指导
  • Oracle题库

本类经典文章推荐

  • Oracle中关于逻辑备份与恢复
  • Oracle开发人员JAVA存储过程
  • 为数据库的表自动生成行号
  • Oracle中的OOP概念
  • 用java从oracle取数
  • 冷备份移植到另一台Solaris机器上
  • 如何将excel数据导入oracle中
  • Oracle10.2g安装记录
  • 数据库监控工具ForOraclev1.2
  • oracle双机群集系统

Oracle指导阅读排行

  • Oracle系统表查询
  • 实例:Oracle导出EXCEL文件
  • Oracle常用的OCI函数上
  • Oracle企业管理器(OEM 2.1)使用...
  • Tomcat+SQLServer连接池配置
  • 如何将excel数据导入oracle中
  • 如何取出某一用户的密码 再原样改...
  • 实例:Oracle导出EXCEL文件
  • 案例学习Oracle错误:ORA-00604
  • 案例学习Oracle错误:ORA-00060

Oracle认证阅读总排行

  • Oracle系统表查询
  • 实例:Oracle导出EXCEL文件
  • Oracle常用的OCI函数上
  • 在ORACLE的存储过程中如何做简单的...
  • Oracle企业管理器(OEM 2.1)使用...
  • Tomcat+SQLServer连接池配置
  • 如何将excel数据导入oracle中
  • AIX下自动启动Oracle数据库与监听...
  • 如何取出某一用户的密码 再原样改...
  • 实例:Oracle导出EXCEL文件

广告位置

字母检索 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 回到顶部

关于我们 | 版权声明 | 免责条款 | 广告联系 | 软件发布 | 下载帮助 | 下载排行 | 网站地图 | 特别鸣谢 | 友情连接

copyright; 2005-2008 D9soft.com 第九软件网 版权所有