ITPUB??ì3
ITPUB论坛 » Oracle专题深入讨论 » Oracle数据库字符集问题解析

标题: [精华] Oracle数据库字符集问题解析
离线 wyq21973
高级会员


精华贴数 0
个人空间 0
技术积分 2922 (515)
社区积分 210 (2265)
注册日期 2004-8-16
论坛徽章:2
会员2006贡献徽章授权会员    
      

发表于 2004-12-27 09:56 
事物既然存在就一定有它的理由,我想在某些场合还是可以用用的。
周末我没来公司,今天来试验一下,有结果再告诉大家。


__________________
Oracle + DB2 + Informatica
只看该作者    顶部
离线 jeffli73
侠之大者


精华贴数 2
个人空间 0
技术积分 10578 (112)
社区积分 21 (7217)
注册日期 2002-6-17
论坛徽章:1
授权会员     
      

发表于 2004-12-27 11:36 
另外

ZHS16GBK与UTF8中文编码是不一样的,如果原来有数据,很可能会有问题


__________________
安能摧眉折腰事权贵,使我不得开心颜天生我才必有用,千金散尽还复来个人BLOG: http://blog.china-pub.com/blog.asp?name=jefflee包括数据库、软件工程、电信及其它方面的个人感悟,如有兴趣,欢迎访问
只看该作者    顶部
离线 wyq21973
高级会员


精华贴数 0
个人空间 0
技术积分 2922 (515)
社区积分 210 (2265)
注册日期 2004-8-16
论坛徽章:2
会员2006贡献徽章授权会员    
      

发表于 2004-12-27 12:07 
Re: 另外



QUOTE:
最初由 jeffli73 发布
ZHS16GBK与UTF8中文编码是不一样的,如果原来有数据,很可能会有问题

你是指大部分汉字在这两个标准中编码不一样,还是指ZHS16GBK所包含的汉字更多些?
如果是指前者那直接更改就会产生错误的结果。
如果我从ZHS16GBK的库导出,再导入UTF8的库中,会出现什么情形呢?(能不能成功,会不会出现部分汉字乱码?)


__________________
Oracle + DB2 + Informatica
只看该作者    顶部
离线 skz12
初级会员



精华贴数 0
个人空间 0
技术积分 4 (136900)
社区积分 0 (158463)
注册日期 2004-9-17
论坛徽章:0
      
      

发表于 2004-12-27 14:16 
虽然我在工作中不使用Oracle, 但这对我很有启发。支持!


只看该作者    顶部
离线 wyq21973
高级会员


精华贴数 0
个人空间 0
技术积分 2922 (515)
社区积分 210 (2265)
注册日期 2004-8-16
论坛徽章:2
会员2006贡献徽章授权会员    
      

发表于 2004-12-27 14:30 
看了eygle的关于字符集的文章感觉update props$的方法不可取。
http://www.eygle.com/index-special.htm


__________________
Oracle + DB2 + Informatica
只看该作者    顶部
离线 jeffli73
侠之大者


精华贴数 2
个人空间 0
技术积分 10578 (112)
社区积分 21 (7217)
注册日期 2002-6-17
论坛徽章:1
授权会员     
      

发表于 2004-12-27 18:57 
Re: Re: 另外



QUOTE:
最初由 wyq21973 发布


你是指大部分汉字在这两个标准中编码不一样,还是指ZHS16GBK所包含的汉字更多些?
如果是指前者那直接更改就会产生错误的结果。
如果我从ZHS16GBK的库导出,再导入UTF8的库中,会出现什么情形呢?(能不能成功,会不会出现部分汉字乱码?)


两者编码完全不一样,但所能支持的汉字(专业的说法是字汇)基本相当,所以理论上如果设置得当EXP/IMP可能成功


__________________
安能摧眉折腰事权贵,使我不得开心颜天生我才必有用,千金散尽还复来个人BLOG: http://blog.china-pub.com/blog.asp?name=jefflee包括数据库、软件工程、电信及其它方面的个人感悟,如有兴趣,欢迎访问
只看该作者    顶部
离线 wyq21973
高级会员


精华贴数 0
个人空间 0
技术积分 2922 (515)
社区积分 210 (2265)
注册日期 2004-8-16
论坛徽章:2
会员2006贡献徽章授权会员    
      

发表于 2004-12-28 09:36 
Re: Re: Re: 另外



QUOTE:
最初由 jeffli73 发布


两者编码完全不一样,但所能支持的汉字(专业的说法是字汇)基本相当,所以理论上如果设置得当EXP/IMP可能成功


下面是我刚测试的结果,导入时字符集转换不成功。
D:\>imp userid=sys/wyq fromuser=gsm touser=gsm rows=n fil
e=c:\f1.dmp,f2.dmp,f3.dmp

Import: Release 8.1.7.0.0 - Production on Tue Dec 28 09:25:12 2004

(c) Copyright 2000 Oracle Corporation.  All rights reserved.


Connected to: Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
With the Partitioning option
JServer Release 8.1.7.0.0 - Production

IMP-00016: required character set conversion (type 852 to 871) not supported
IMP-00000: Import terminated unsuccessfully

sys@ORCL>Select Nls_Charset_Id(Value) Nls_Charset_Id, Value Nls_Charset_Name
  2    From V$nls_Valid_Values
  3   Where Parameter = 'CHARACTERSET'
  4     And Nls_Charset_Id(Value) In (852, 871);

NLS_CHARSET_ID NLS_CHARSET_NAME
-------------- ----------------------------------------------------------------
           852 ZHS16GBK
           871 UTF8

这种情形该如何处理?


__________________
Oracle + DB2 + Informatica
只看该作者    顶部
离线 jeffli73
侠之大者


精华贴数 2
个人空间 0
技术积分 10578 (112)
社区积分 21 (7217)
注册日期 2002-6-17
论坛徽章:1
授权会员     
      

发表于 2005-3-30 18:10 
有可能是Oracle 8 还不支持

看了wyq21973朋友的帖子,当时就有些疑问,因为上面我也提到从理论上讲汉字由ZHS16GBK到UTF8的转换是可能的,是不是因为wyq21973朋友用的Oracle8.1.7,还没提供这种转换呢,但由于当时也没条件试,就放了下来,最近看到论坛里关于字符集的问题又不少,于是决定做一下进一步的实验;
我的PC上本来已经装了一个数据库test1,字符集为ZHS16GBK,今天利用DBCA又建了一个test2,字符集选用UTF8。
实验所用的数据库版本为:Oracle9i Enterprise Edition Release 9.2.0.1.0

1.确认源数据库的字符集:
SCOTT@test1>  select * from nls_database_parameters;

PARAMETER                      VALUE
------------------------------ ---------------------------------------------------------------------
NLS_LANGUAGE                   AMERICAN
NLS_TERRITORY                  AMERICA
NLS_CURRENCY                   $
NLS_ISO_CURRENCY               AMERICA
NLS_NUMERIC_CHARACTERS         .,
NLS_CHARACTERSET               ZHS16GBK
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              9.2.0.1.0

20 rows selected.

注意:是ZHS16GBK。

2.确认转换前的数据:
SCOTT@test1> select deptno,dname,loc,dump(loc) from dept where deptno=50;

    DEPTNO DNAME          LOC
---------- -------------- -------------
DUMP(LOC)
----------------------------------------------------------------------------------------------------
       50 1              1中文
Typ=1 Len=5: 49,214,208,206,196


可以看到“中文”两个字占用4个字节(每个汉字2个字节),是ZHS16GBK编码;

3.导出源数据
D:\oracle\ora92\bin>set ORACLE_SID=test1

D:\oracle\ora92\bin>exp

Export: Release 9.2.0.1.0 - Production on Wed Mar 30 16:56:15 2005

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.


Username: scott/tiger

Connected to: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production
Enter array fetch buffer size: 4096 >

Export file: EXPDAT.DMP > dept1

(2)U(sers), or (3)T(ables): (2)U > t

Export table data (yes/no): yes >

Compress extents (yes/no): yes >

Export done in ZHS16GBK character set and AL16UTF16 NCHAR character set

About to export specified tables via Conventional Path ...
Table(T) or Partition(T:P) to be exported: (RETURN to quit) > dept

. . exporting table                           DEPT          8 rows exported
Table(T) or Partition(T:P) to be exported: (RETURN to quit) >

Export terminated successfully without warnings.

4.确认目标数据库的字符集
SCOTT1@test2> select * from nls_database_parameters;

PARAMETER                                                    VALUE
------------------------------------------------------------ ---------------------------------------
NLS_LANGUAGE                                                 AMERICAN
NLS_TERRITORY                                                AMERICA
NLS_CURRENCY                                                 $
NLS_ISO_CURRENCY                                             AMERICA
NLS_NUMERIC_CHARACTERS                                       .,
NLS_CHARACTERSET                                             UTF8
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                                            9.2.0.1.0

20 rows selected.

注意:是UTF8。

5.导入目标数据库
D:\oracle\ora92\bin>set ORACLE_SID=test2

D:\oracle\ora92\bin>imp

Import: Release 9.2.0.1.0 - Production on Wed Mar 30 16:58:16 2005

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

Username: scott1
Password:

Connected to: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production

Import file: EXPDAT.DMP > dept1

Enter insert buffer size (minimum is 8192) 30720>

Export file created by EXPORT:V09.02.00 via conventional path

Warning: the objects were exported by SCOTT, not by you

import done in ZHS16GBK character set and AL16UTF16 NCHAR character set
import server uses UTF8 character set (possible charset conversion)

List contents of import file only (yes/no): no >

Ignore create error due to object existence (yes/no): no >

Import grants (yes/no): yes >

Import table data (yes/no): yes >

Import entire export file (yes/no): no >
Username: scott

Enter table(T) or partition(T:P) names. Null list means all tables for user
Enter table(T) or partition(T:P) name or . if done: dept

Enter table(T) or partition(T:P) name or . if done: .

. importing SCOTT's objects into SCOTT1
. . importing table                         "DEPT"          8 rows imported
Import terminated successfully without warnings.

D:\oracle\ora92\bin>

注意上面的提示:
import done in ZHS16GBK character set and AL16UTF16 NCHAR character set
import server uses UTF8 character set (possible charset conversion)

6.检查导入数据是否正确
SCOTT1@test2>  select deptno,dname,loc,dump(loc) from dept where deptno=50;

    DEPTNO DNAME                        LOC
---------- ---------------------------- --------------------------
DUMP(LOC)
----------------------------------------------------------------------------------------------------
       50 1                            1中文
Typ=1 Len=7: 49,228,184,173,230,150,135


可以看到“中文”两个字占用6个字节(每个汉字3个字节),是UTF8编码;

7.小结
在Oracle 9.2环境下,汉字可以由ZHS16GBK转换为UTF8;
数据库服务器选用的字符集虽然可以各不相同,但只要各种相关设置正确,Oracle总是尽可能地将正确的转换结果呈现给客户端的用户。



__________________
安能摧眉折腰事权贵,使我不得开心颜天生我才必有用,千金散尽还复来个人BLOG: http://blog.china-pub.com/blog.asp?name=jefflee包括数据库、软件工程、电信及其它方面的个人感悟,如有兴趣,欢迎访问
只看该作者    顶部
离线 mingxf
初级会员



精华贴数 0
个人空间 0
技术积分 50 (27392)
社区积分 0 (283002)
注册日期 2005-2-22
论坛徽章:0
      
      

发表于 2005-3-31 16:20 
豁然开朗,好贴

我们开发 操作系统环境NLS_LANG=american_america.zhs16gbk
oracle  NSL_CHARACTERSET=zhs16gbk, 没有仔细想过这方面的意义,看过本文后豁然开朗。


只看该作者    顶部
离线 flyingrat
人生就是吃、拉、撒!



精华贴数 0
个人空间 0
技术积分 906 (2034)
社区积分 282 (1908)
注册日期 2002-11-29
论坛徽章:1
      
      

发表于 2005-4-5 14:58 
good text


__________________
醉里且贪欢笑,要愁哪得工夫。岂能尽如人意?但求无愧于心。Email: mikezhh@163.comMSN: mikezhh@hotmail.com
只看该作者    顶部
相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问