楼主: jeffli73

[精华] Oracle数据库字符集问题解析

[复制链接]
论坛徽章:
0
发表于 2005-8-8 09:43 | 显示全部楼层

分析得太好了.

是我看到过对oracle字符集分析比较好的帖子.
    在这里我只是强调一点我的认识.

     更改服务器字符集ZHS16GBK
  update props$ set value$='ZHS16GBK' where name='NLS_CHARACTERSET'
   上述修改oracle官方不推荐使用,但是本人在网站使用后没有发生什么问题.所以大家如果必须要修改掉服务器字符集,可以使用.

   比较安全的做法是.先用exp导出到一个测试环境.那个测试环境的数据库字符集应该同你生产机上的数据库字符集是一致的.导入后,在按照上述操作. 经过一段测试没有问题后在对生产机进行字符集修改.

使用道具 举报

回复
论坛徽章:
18
操作系统板块每日发贴之星
日期:2005-07-28 01:01:51沸羊羊
日期:2015-03-04 14:43:43马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:072011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB9周年纪念徽章
日期:2010-10-08 09:32:272009新春纪念徽章
日期:2009-01-04 14:52:282008新春纪念徽章
日期:2008-02-13 12:43:03ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
发表于 2005-8-10 11:53 | 显示全部楼层
to  yl1998
    你的问题是要使用Csscan工具帮助你找出那些需要表的列需要重新定义. 然后一一修改. 并不很复杂.
   
     在itpub的一号FTP的这个目录下:
     /incoming/A_By_Askguoyu/Oracle/CharSet

      有一些关于这个问题的Vedio的讨论. 最后一个是关于Scscan的.

使用道具 举报

回复
论坛徽章:
0
发表于 2005-8-10 12:46 | 显示全部楼层
l楼上的FTP怎么上  好像要用户名&密码

使用道具 举报

回复
论坛徽章:
18
操作系统板块每日发贴之星
日期:2005-07-28 01:01:51沸羊羊
日期:2015-03-04 14:43:43马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:072011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB9周年纪念徽章
日期:2010-10-08 09:32:272009新春纪念徽章
日期:2009-01-04 14:52:282008新春纪念徽章
日期:2008-02-13 12:43:03ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
发表于 2005-8-10 15:05 | 显示全部楼层
to 27556722
  在ITpub提供的一号FTP上. 请到授权用户区去看访问方法.

=========================================================
  另外, 我的个人网站上的很多网络U盘已经过期了, 不可以使用了.

使用道具 举报

回复
论坛徽章:
0
发表于 2005-8-17 16:40 | 显示全部楼层

收益匪浅

写的真好

使用道具 举报

回复
论坛徽章:
0
发表于 2005-8-18 16:15 | 显示全部楼层
收获很大,在测试过程中,增加了一些新的case,在测试过程中,发现“替代字符”往往容易转换成“靠”,“?”,“?”,“驴”,对这些乱码的产生原因有些不解!

1,数据库字符集设为gb2312,客户端设为WE8ISO8859P1,然后插入数据,读取数据
SET NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
sqlplus system/manager@gb2312
select * from nls_database_parameters where PARAMETER='NLS_CHARACTERSET';
PARAMETER VALUE
--------------------------------- ---------------------------------
NLS_CHARACTERSET ZHS16CGB231280

insert into charset_test(server_charset,os_charset,client_charset,cn_char) values('GB2312','GB2312','ISO8859','中文');
commit;
column dump format a40
select server_charset,os_charset,client_charset,cn_char,dump(cn_char) dump from charset_test where client_charset='ISO8859' and os_charset='GB2312';
SERVER_ OS_CHAR CLIENT_ CN_CHAR DUMP
------- ------- ------- ------- ------------------------------
GB2312 GB2312 ISO8859 靠 Typ=1 Len=4: 214,208,206,196
可以看到存储是完全正确的,但是在读取的时候,出现“靠”(在gb2312中编码为191,191),我猜测,在这种环境下“替代字符”的编码是BF,由于两个替代字符BFBF,导致出现了一个“靠”
疑问:在Oracle中,各种环境下的替代字符是不是都是"?"?按照测试结果好像不是。另外,为什么显示结果“靠”(191,191)
在ISO8859 字符环境下,“替代字符”也应该是"?",在gb2312中,倒是有可能是中文“?”其编码是:163,191,但是无论如何,都不应该是”靠“
在服务器端字符集为iso8859,客户端字符集为:gb2312的环境下进行读取,存储测试!

SET NLS_LANG=AMERICAN_AMERICA.ZHS16CGB231280
sqlplus system/manager@iso8859
select * from nls_database_parameters where PARAMETER='NLS_CHARACTERSET';
PARAMETER VALUE
--------------------------------- ---------------------------------
NLS_CHARACTERSET WE8ISO8859P1
insert into charset_test(server_charset,os_charset,client_charset,cn_char) values('ISO8859','GB2312','GB2312','中文');
commit;
column dump format a40
select server_charset,os_charset,client_charset,cn_char,dump(cn_char) dump from charset_test where client_charset='GB2312' and os_charset='GB2312';

SERVER_CHARSET OS_CHARSET CLIENT_CHARSET CN_CHAR
-------------- -------------- -------------- --------------
DUMP
------------------------------
ISO8859 GB2312 GB2312 ??
Typ=1 Len=2: 191,191
疑问:为什么存储了191?难道191真的是某种字符集的“替代字符”?191但是显示结果为什么是“?”?

SET NLS_LANG=AMERICAN_AMERICA.UTF8
sqlplus system/manager@iso8859
insert into charset_test(server_charset,os_charset,client_charset,cn_char) values('ISO8859','GB2312','UTF8','中文');
commit;
column dump format a40
select server_charset,os_charset,client_charset,cn_char,dump(cn_char) dump from charset_test where client_charset='UTF8' and os_charset='GB2312';

SERVER_CHARSET OS_CHARSET CLIENT_CHARSET
--------------------- --------------------- ---------------------
CN_CHAR DUMP
--------------------- ------------------------------
ISO8859 GB2312 UTF8
驴驴 Typ=1 Len=2: 191,191
疑问:为什么191在UTF8下表示成为“驴”?

使用道具 举报

回复
论坛徽章:
3
授权会员
日期:2005-10-30 17:05:33ITPUB技术丛书作者
日期:2010-09-26 15:24:56优秀写手
日期:2014-02-13 06:00:15
 楼主| 发表于 2005-8-21 13:06 | 显示全部楼层

感谢ygzeng朋友补充的例子,下面我就分析一下

请ygzeng朋友给出实验时数据库的版本、client端OS的类型、版本,因为这些因素有可能导致实验结果的差别。

1.数据库字符集设为gb2312,客户端设为WE8ISO8859P1。
insert into charset_test(server_charset,os_charset,client_charset,cn_char) values('GB2312','GB2312','ISO8859','中文');
我的实验环境是数据库与client端在一台PC机上,OS为windows20003,Oracle为10.1.0.2,字符集请选用GBK。
执行上述插入与你的结果不一样,请将你的实验环境再详细描述一下。
关于插入后查询结果:
select server_charset,os_charset,client_charset,cn_char,dump(cn_char) dump from charset_test where
client_charset='ISO8859' and os_charset='GB2312';
SERVER_ OS_CHAR CLIENT_ CN_CHAR DUMP
------- ------- ------- ------- ------------------------------
GB2312 GB2312 ISO8859 靠 Typ=1 Len=4: 214,208,206,196
是可以理解的,服务器端为gb2312,(214,208)与(206,196)在ISO8859-1中没有对应字符,需要转换为替换字符,从实验结果看转换为191(0xBF),而在ISO8859-1中191(0xBF)对应的字符为¿,好象一个倒写的?,而191-128(即去掉191二进制最高位的1)为63,我们可以查一下ASCII码,正好是问号(?)的编码,看来拿此字符作为WE8ISO8859P1的替换字符也没什么可奇怪的。
Oracle将(214,208,206,196)转换为(191,191),而client操作系统如你所说也采用GB2312,而(191,191)正是“靠”的编码,所以显示“靠”。

使用道具 举报

回复
论坛徽章:
0
发表于 2005-8-22 11:34 | 显示全部楼层
jeffli73,我的数据库版本是8.1.7.0.0,客户端安装了英文版本的windows2000+sp4(地区设置为:中华人民共和国,默认语言是:简体中文),客户端的数据库版本是:9.2.0.5!
是不是在不同的字符集下面,"替代字符"都不一样,并且"替代字符"由服务器端的字符集决定?而且这些"替代字符"在不同的环境下可以相互替代,也就是说iso8859下的" ¿ "(BF),如果客户端是gb2312,就会显示"?"(A3BF)

使用道具 举报

回复
论坛徽章:
0
发表于 2005-8-23 14:45 | 显示全部楼层
被好好上了一课

使用道具 举报

回复
论坛徽章:
3
授权会员
日期:2006-04-14 13:41:02会员2007贡献徽章
日期:2007-09-26 18:42:10生肖徽章2007版:鼠
日期:2008-01-02 17:35:53
发表于 2005-8-24 10:21 | 显示全部楼层
我碰到下一个奇怪的问题:server:HPUX: Version 9.2.0.1.0 + Oracle9i Enterprise Edition Release 9.2.0.1.0 - 64bit Production + NLS_CHARACTERSET US7ASCII ,client:win2000 + Oracle9.2 + "NLS_LANG"="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"(注册表内容,并且环境变量 nls_lang 没有定义),按照前面的说法,应该不能正常工作,但是现在系统在正常运行,为什么?请帮忙解释一下!
下面是我的测试过程:
SQL> select * from sys.props$ ;

NAME                                                         VALUE$                                   COMMENT$                                                                                                                                                                                             
------------------------------------------------------------ ---------------------------------------- ----------------------------------------                                                                                                                                                              
DICT.BASE                                                    2                                        dictionary base tables version #                                                                                                                                                                     
DEFAULT_TEMP_TABLESPACE                                      TEMP                                     Name of default temporary tablespace                                                                                                                                                                  
DBTIMEZONE                                                   -04:00                                   DB time zone                                                                                                                                                                                          
NLS_LANGUAGE                                                 AMERICAN                                 Language                                                                                                                                                                                             
NLS_TERRITORY                                                AMERICA                                  Territory                                                                                                                                                                                             
NLS_CURRENCY                                                 $                                        Local currency                                                                                                                                                                                       
NLS_ISO_CURRENCY                                             AMERICA                                  ISO currency                                                                                                                                                                                          
NLS_NUMERIC_CHARACTERS                                       .,                                       Numeric characters                                                                                                                                                                                    
NLS_CHARACTERSET                                             US7ASCII                                 Character set                                                                                                                                                                                         
NLS_CALENDAR                                                 GREGORIAN                                Calendar system                                                                                                                                                                                       
NLS_DATE_FORMAT                                              DD-MON-RR                                Date format                                                                                                                                                                                          

NAME                                                         VALUE$                                   COMMENT$                                                                                                                                                                                             
------------------------------------------------------------ ---------------------------------------- ----------------------------------------                                                                                                                                                              
NLS_DATE_LANGUAGE                                            AMERICAN                                 Date language                                                                                                                                                                                         
NLS_SORT                                                     BINARY                                   Linguistic definition                                                                                                                                                                                 
NLS_TIME_FORMAT                                              HH.MI.SSXFF AM                           Time format                                                                                                                                                                                          
NLS_TIMESTAMP_FORMAT                                         DD-MON-RR HH.MI.SSXFF AM                 Time stamp format                                                                                                                                                                                    
NLS_TIME_TZ_FORMAT                                           HH.MI.SSXFF AM TZR                       Time with timezone format                                                                                                                                                                             
NLS_TIMESTAMP_TZ_FORMAT                                      DD-MON-RR HH.MI.SSXFF AM TZR             Timestamp with timezone format                                                                                                                                                                        
NLS_DUAL_CURRENCY                                            $                                        Dual currency symbol                                                                                                                                                                                 
NLS_COMP                                                     BINARY                                   NLS comparison                                                                                                                                                                                       
NLS_LENGTH_SEMANTICS                                         BYTE                                     NLS length semantics                                                                                                                                                                                 
NLS_NCHAR_CONV_EXCP                                          FALSE                                    NLS conversion exception                                                                                                                                                                              
NLS_NCHAR_CHARACTERSET                                       UTF8                                     NCHAR Character set                                                                                                                                                                                   

NAME                                                         VALUE$                                   COMMENT$                                                                                                                                                                                             
------------------------------------------------------------ ---------------------------------------- ----------------------------------------                                                                                                                                                              
NLS_RDBMS_VERSION                                            9.2.0.1.0                                RDBMS version for NLS parameters                                                                                                                                                                     
GLOBAL_DB_NAME                                               ORCL.US.ORACLE.COM                       Global database name                                                                                                                                                                                 
EXPORT_VIEWS_VERSION                                         8                                        Export views revision #                                                                                                                                                                              

已选择25行。

SQL> create table test
  2  (
  3  name varchar2(10)
  4  )
  5  /

表已创建。

SQL> insert into test values ('test') ;

已创建 1 行。

SQL> insert into test values ('测试') ;

已创建 1 行。

SQL> commit
  2  /

提交完成。

SQL> select * from test ;

NAME                                                                           
----------                                                                     
test                                                                           
测试                                                                           
                                                   
SQL> col dump(name) for a30
SQL> /

NAME       LENGTH(NAME) DUMP(NAME)                                             
---------- ------------ ------------------------------                          
test                  4 Typ=1 Len=4: 116,101,115,116                           
测试        2 Typ=1 Len=4: 178,226,202,212                           

SQL> insert into test values ('1测试') ;

已创建 1 行。

SQL> commit;

提交完成。

SQL> host
Microsoft Windows 2000 [Version 5.00.2195]
(C) 版权所有 1985-2000 Microsoft Corp.

C:\Documents and Settings\Administrator>chcp
活动的代码页: 936  (本地系统是简体中文)

C:\Documents and Settings\Administrator>set nls_lang
环境变量 nls_lang 没有定义
SQL> host

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表