ITPUB论坛-中国最专业的IT技术社区

 找回密码
 注册
查看: 443|回复: 21

exp utf8->us7ascii imp us7ascii->utf8 中文为什么没有乱码?

[复制链接]
论坛徽章:
6
CTO参与奖
日期:2009-02-20 09:44:20数据库板块每日发贴之星
日期:2009-04-02 01:01:032009日食纪念
日期:2009-07-22 09:30:002010新春纪念徽章
日期:2010-03-01 11:21:02咸鸭蛋
日期:2011-08-29 08:45:46ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28
发表于 2018-1-10 15:36 | 显示全部楼层 |阅读模式
我的老库数据库字符集 AL32UTF8, 客户端NLS_LANG指定的字符集US7ASCII. 用EXP导出数据, 数据中包含中文. 这一步ORACLE会进行字符集的转换, 即把AL32UTF8 转换为US7ASCII. 从下方的导出的日志中可以看出,
[oracle@oracle32 ~]$ exp hr/hr tables=hztab file=hz.dmp
Export: Release 11.2.0.4.0 - Production on Wed Jan 10 10:18:25 2018
Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Export done in US7ASCII character set and AL16UTF16 NCHAR character set
server uses AL32UTF8 character set (possible charset conversion)


About to export specified tables via Conventional Path ...
. . exporting table                          HZTAB          2 rows exported
Export terminated successfully without warnings.

按道理说由于汉字在US7ASCII中没有对应的编码, 所以中文字符会转换为不可识别的编码. 接着在导入到另外一个数据库()数据库字符集为AL32UTF8) 中文字符应该显示为乱码才对. 可是为什么中文能够正常显示呢?
imp edwin/edwin fromuser=hr touser=edwin file=hz.dmp
Import: Release 11.2.0.4.0 - Production on Wed Jan 10 10:19:14 2018
Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Export file created by EXPORT:V11.02.00 via conventional path
Warning: the objects were exported by HR, not by you
import done in US7ASCII character set and AL16UTF16 NCHAR character set
import server uses AL32UTF8 character set (possible charset conversion)

. importing HR's objects into EDWIN
. . importing table                        "HZTAB"          2 rows imported
Import terminated successfully with warnings.

--在新库中查看 此时客户端字符集为zhs16gbk
select * from hztab;
        ID NAME
---------- ----------------------------------------
         1 张三
         2 李四

论坛徽章:
116
现任管理团队成员
日期:2011-05-07 01:45:08娜美
日期:2017-08-29 10:15:28
发表于 2018-1-10 19:02 | 显示全部楼层
因为US7ASCII是单位字符集,你着几个汉字在utf8中多位存储,但是单位在ASCII都有对应编码,不需要用通用编码替换。所以再次导入导出时都幸运的没有丢失编码(没有被用通用编码替换)。所以可以正常显示
来自苹果客户端来自客户端

使用道具 举报

回复
论坛徽章:
116
现任管理团队成员
日期:2011-05-07 01:45:08娜美
日期:2017-08-29 10:15:28
发表于 2018-1-10 19:09 | 显示全部楼层
你dump一下就明白了
来自苹果客户端来自客户端

使用道具 举报

回复
论坛徽章:
6
CTO参与奖
日期:2009-02-20 09:44:20数据库板块每日发贴之星
日期:2009-04-02 01:01:032009日食纪念
日期:2009-07-22 09:30:002010新春纪念徽章
日期:2010-03-01 11:21:02咸鸭蛋
日期:2011-08-29 08:45:46ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28
 楼主| 发表于 2018-1-11 08:29 | 显示全部楼层
zergduan 发表于 2018-1-10 19:09
你dump一下就明白了

DUMP我已经做过了, ZHS16GBK的1个汉字在UTF8中使用3个字节存储;  我理解"单位在ASCII都有对应编码"这句话的意思是说在我这个例子中(2行记录,每个记录2个汉字,每行记录对应UTF8有6个字节)每个字节在US7ASCII都有对应的编码? 那能否举个在US7ASCII中找不到对应编码的例子呢?

使用道具 举报

回复
论坛徽章:
116
现任管理团队成员
日期:2011-05-07 01:45:08娜美
日期:2017-08-29 10:15:28
发表于 2018-1-11 08:43 | 显示全部楼层
chen222246lei 发表于 2018-1-11 08:29
DUMP我已经做过了, ZHS16GBK的1个汉字在UTF8中使用3个字节存储;  我理解"单位在ASCII都有对应编码"这句话 ...

是这个意思,你看一下ASCII编码表,我印象中最大是128,找一个中文或者其他语言字符,确保他的单位编码有大于128的,再做一遍
来自苹果客户端来自客户端

使用道具 举报

回复
论坛徽章:
116
现任管理团队成员
日期:2011-05-07 01:45:08娜美
日期:2017-08-29 10:15:28
发表于 2018-1-11 08:50 | 显示全部楼层
简单的可以去查unicode编码表
来自苹果客户端来自客户端

使用道具 举报

回复
论坛徽章:
6
CTO参与奖
日期:2009-02-20 09:44:20数据库板块每日发贴之星
日期:2009-04-02 01:01:032009日食纪念
日期:2009-07-22 09:30:002010新春纪念徽章
日期:2010-03-01 11:21:02咸鸭蛋
日期:2011-08-29 08:45:46ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28
 楼主| 发表于 2018-1-11 09:26 | 显示全部楼层
SQL> select dump('张三',1016) from dual;
DUMP('张三',1016)
----------------------------------------------------------------------------------------------------------
Typ=96 Len=6 CharacterSet=AL32UTF8: e5,bc,a0,e4,b8,89

SQL> select dump('张三',1010) from dual;
DUMP('张三',1010)
----------------------------------------------------------------------------------------------------------------------
Typ=96 Len=6 CharacterSet=AL32UTF8: 229,188,160,228,184,137

ASCII能够存储128个字符, 编码从0~127, 但是实际上汉字DUMP出来的每个字节的值都超过了127, 那么ASCII是如何对应的呢?  实际上无论我存储了多么复杂的汉字, IMP后都能够显示出来. 如下例:

--源库(字符集AL32UTF8)
SQL> select * from hztab;
        ID NAME
---------- --------------------------------------------------------------------------------
         1 鑫森淼焱垚犇骉羴猋麤鱻贔掱劦晶磊毳畾飝刕叒壵尛孨歮惢皛嚞舙譶雥灥飍馫飝厵靐龘三众
           叒品晿瞐舙雥雦鑫矗灥飍馫晿

--EXP导出
[oracle@oracle32 ~]$ export NLS_LANG=
[oracle@oracle32 ~]$ exp hr/hr tables=hztab file=hz.dmp
Export: Release 11.2.0.4.0 - Production on Thu Jan 11 09:18:09 2018
Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Export done in US7ASCII character set and AL16UTF16 NCHAR character set
server uses AL32UTF8 character set (possible charset conversion)


About to export specified tables via Conventional Path ...
. . exporting table                          HZTAB          1 rows exported

--在同一个数据库的其他用户导入
[oracle@oracle32 ~]$ imp edwin/edwin fromuser=hr touser=edwin file=hz.dmp
Import: Release 11.2.0.4.0 - Production on Thu Jan 11 09:18:20 2018
Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

Export file created by EXPORT:V11.02.00 via conventional path
Warning: the objects were exported by HR, not by you

import done in US7ASCII character set and AL16UTF16 NCHAR character set
import server uses AL32UTF8 character set (possible charset conversion)

. importing HR's objects into EDWIN
. . importing table                        "HZTAB"          1 rows imported
Import terminated successfully without warnings.

--在新用户下查看
SQL> select * from hztab;
        ID NAME
---------- --------------------------------------------------------------------------------
         1 鑫森淼焱垚犇骉羴猋麤鱻贔掱劦晶磊毳畾飝刕叒壵尛孨歮惢皛嚞舙譶雥灥飍馫飝厵靐龘三众
           叒品晿瞐舙雥雦鑫矗灥飍馫晿

感觉AL32UTF8 -> US7ASCII的转换没有任何的编码丢失, 这个原因到底出来哪儿呢?

使用道具 举报

回复
论坛徽章:
116
现任管理团队成员
日期:2011-05-07 01:45:08娜美
日期:2017-08-29 10:15:28
发表于 2018-1-11 09:32 | 显示全部楼层
本帖最后由 zergduan 于 2018-1-11 09:33 编辑
chen222246lei 发表于 2018-1-11 09:26
SQL> select dump('张三',1016) from dual;
DUMP('张三',1016)
--------------------------------------- ...

有点意思。。。这相当于说,AL32UTF8 导出 US7ASCII时,及时没有对应编码,也不做通用编码替换。。。

使用道具 举报

回复
论坛徽章:
116
现任管理团队成员
日期:2011-05-07 01:45:08娜美
日期:2017-08-29 10:15:28
发表于 2018-1-11 09:35 | 显示全部楼层
难道说US7ASCII的编码表不是0~127? 看上去只能这么解释了。。。

使用道具 举报

回复
论坛徽章:
116
现任管理团队成员
日期:2011-05-07 01:45:08娜美
日期:2017-08-29 10:15:28
发表于 2018-1-11 09:38 | 显示全部楼层
果然,我查了oracle US7ASCII的编码表,一直到0xff都有,只不过0x7f之后的编码显示字符是相同的“口”

所以不会丢失编码。你可以遭袭击用local build看看

使用道具 举报

回复

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

本版积分规则

DTCC2018购票6.8折优惠进行时

中国数据库技术大会是国内数据库及大数据领域规模最大、最受欢迎的技术交流盛会。 2018年5月10-12日,第九届中国数据库技术大会将如约而至。本届大会以“数领先机•智赢未来”为主题,设定2大主会场及20个技术专场,邀请来自国内外互联网、金融、教育等行业百余位技术专家,共同探讨Oracle、MySQL、NoSQL、大数据等领域的前瞻性热点话题与技术。
----------------------------------------
优惠时间:2018年2月13日前

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