楼主: jeffli73

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

[复制链接]
论坛徽章:
10
授权会员
日期:2005-10-30 17:05:332010年世界杯参赛球队:科特迪瓦
日期:2010-04-15 12:20:472010年世界杯参赛球队:智利
日期:2010-04-13 17:15:21生肖徽章2007版:蛇
日期:2009-09-24 13:54:11生肖徽章2007版:龙
日期:2009-09-22 13:56:012009日食纪念
日期:2009-07-22 09:30:00生肖徽章2007版:龙
日期:2009-02-10 13:45:15生肖徽章2007版:狗
日期:2009-02-03 13:53:34会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28
发表于 2004-12-27 09:56 | 显示全部楼层
事物既然存在就一定有它的理由,我想在某些场合还是可以用用的。
周末我没来公司,今天来试验一下,有结果再告诉大家。

使用道具 举报

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

另外

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

使用道具 举报

回复
论坛徽章:
10
授权会员
日期:2005-10-30 17:05:332010年世界杯参赛球队:科特迪瓦
日期:2010-04-15 12:20:472010年世界杯参赛球队:智利
日期:2010-04-13 17:15:21生肖徽章2007版:蛇
日期:2009-09-24 13:54:11生肖徽章2007版:龙
日期:2009-09-22 13:56:012009日食纪念
日期:2009-07-22 09:30:00生肖徽章2007版:龙
日期:2009-02-10 13:45:15生肖徽章2007版:狗
日期:2009-02-03 13:53:34会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28
发表于 2004-12-27 12:07 | 显示全部楼层

Re: 另外

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


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

使用道具 举报

回复
论坛徽章:
0
发表于 2004-12-27 14:16 | 显示全部楼层
虽然我在工作中不使用Oracle, 但这对我很有启发。支持!

使用道具 举报

回复
论坛徽章:
10
授权会员
日期:2005-10-30 17:05:332010年世界杯参赛球队:科特迪瓦
日期:2010-04-15 12:20:472010年世界杯参赛球队:智利
日期:2010-04-13 17:15:21生肖徽章2007版:蛇
日期:2009-09-24 13:54:11生肖徽章2007版:龙
日期:2009-09-22 13:56:012009日食纪念
日期:2009-07-22 09:30:00生肖徽章2007版:龙
日期:2009-02-10 13:45:15生肖徽章2007版:狗
日期:2009-02-03 13:53:34会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28
发表于 2004-12-27 14:30 | 显示全部楼层
看了eygle的关于字符集的文章感觉update props$的方法不可取。
http://www.eygle.com/index-special.htm

使用道具 举报

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

Re: Re: 另外

最初由 wyq21973 发布
[B]

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


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

使用道具 举报

回复
论坛徽章:
10
授权会员
日期:2005-10-30 17:05:332010年世界杯参赛球队:科特迪瓦
日期:2010-04-15 12:20:472010年世界杯参赛球队:智利
日期:2010-04-13 17:15:21生肖徽章2007版:蛇
日期:2009-09-24 13:54:11生肖徽章2007版:龙
日期:2009-09-22 13:56:012009日食纪念
日期:2009-07-22 09:30:00生肖徽章2007版:龙
日期:2009-02-10 13:45:15生肖徽章2007版:狗
日期:2009-02-03 13:53:34会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28
发表于 2004-12-28 09:36 | 显示全部楼层

Re: Re: Re: 另外

最初由 jeffli73 发布
[B]

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


下面是我刚测试的结果,导入时字符集转换不成功。
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

这种情形该如何处理?

使用道具 举报

回复
论坛徽章:
3
授权会员
日期:2005-10-30 17:05:33ITPUB技术丛书作者
日期:2010-09-26 15:24:56优秀写手
日期:2014-02-13 06:00:15
 楼主| 发表于 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         .,
[B]NLS_CHARACTERSET               ZHS16GBK[/B]
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)
----------------------------------------------------------------------------------------------------
[B]       50 1              1中文
Typ=1 Len=5: 49,214,208,206,196 [/B]

可以看到“中文”两个字占用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 >

[B]Export done in ZHS16GBK character set and AL16UTF16 NCHAR character set[/B]

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                                       .,
[B]NLS_CHARACTERSET                                             UTF8[/B]
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

[B]import done in ZHS16GBK character set and AL16UTF16 NCHAR character set
import server uses UTF8 character set (possible charset conversion)[/B]
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)
----------------------------------------------------------------------------------------------------
[B]       50 1                            1中文
Typ=1 Len=7: 49,228,184,173,230,150,135 [/B]

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

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

使用道具 举报

回复
论坛徽章:
0
发表于 2005-3-31 16:20 | 显示全部楼层

豁然开朗,好贴

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

使用道具 举报

回复
论坛徽章:
2
ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41
发表于 2005-4-5 14:58 | 显示全部楼层
good text

使用道具 举报

回复

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

本版积分规则 发表回复

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