知识大全 字符集转换的exp/imp试验一
Posted 中文
篇首语:生命是不能被略过的,一定有人敢选最难的那条路,一定有人把生命排在利益前面。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 字符集转换的exp/imp试验一相关的知识,希望对你有一定的参考价值。
以前也看了一些关于字符集转换的文章 但是实际使用的时候还是发生了问题 出现了乱码 为了彻底搞清楚字符集问题 我决定做测试 用EXP/IMP工具在不同字符集之间互相转换数据 环境 两台测试PC机器 分称A机器( )和B机器( ) 两台机器的配置都是一致的 安装WIN 操作系统和Oracle 数据库 计划从A机器导出包含有中文的数据 然后倒入到B机器中 测试计划 分别在两台机器上安装两个instance 这两个instance又分别是中 英文字符集 为了简单起见 国家字符集和字符集设置都是一样的 就是说 设置成英文字符集的时候 上面说的两个设置都是US ASCII 设置中文字符集的时候都是ZHS GBK 我没有考虑国家字符集和字符集不一致的情况 客户端也分成C D两个部分 实际测试的时候C和D是一个客户端 因为如果A和C的字符集不一致 是不允许导出的 同样 如果B和D的字符集不一致 是不允许导入的 在C机器上建立四个服务指向上面新建的 个instance c 中文 在A机器上 e 英文 在A机器上 c 中文 在B机器上 e 英文 在B机器上 四个进程都建立相同的用户和表 Connect system/manager Create user test identified by test default tablespace users temporary tablespace temp; Grant connect resource to test; Connect test/test Create table emp(id number( ) address varchar ( )); 然后只在A机器上的两个进程中插入数据 Insert into emp(id address) values( 北京市 ); Insert into emp(id address) values( 成都市 ); Insert into emp(id address) values( 上海市 ); Insert into emp(id address) values( 天津市 ); Insert into emp(id address) values( 重庆市 ); Insert into emp(id address) values( 武汉市 ); Insert into emp(id address) values( 广州市 ); Commit; 然后测试 过程如下 一 在C机器上测试 C机器是英文字符集 exp system/manager@ c file=c: c dmp owner=test exp system/manager@ e file=c: e dmp owner=test 都导出成功 发现上面两个文件的ACSII字符集都是 二 在C机器上测试 C机器换成中文字符集 exp system/manager@ c file=c: c dmp owner=test exp system/manager@ e file=c: e dmp owner=test 发现上面两个文件的ACSII字符集都是 A机器上的数据库变换字符集 就是把原来英文字符集数据库换成中文字符集 把原来中文字符集数据库换成英文字符集 备注 之后没有把原来的数据删掉重新录入中文数据 而是用以前的旧的数据 后来发现 原来英文字符集数据库换成中文字符集后 数据可以正常显示 反之 中文字符集数据库换成英文字符集后 数据已经是乱码了 已经不能正常显示了 原因 中文字符集占两个字节 英文字符集占一个字节 所以当中文转换成英文的时候 数据库压缩 数据就无法正常显示了 反过来可以正常显示 所以推荐建立数据库的时候用英文字符集 好处多多(包括全文索引的时候) 所以后来倒出的 c dmp和 c dmp实际上包含的数据都已经是不对的 测试已经没有意义了 于是我重新进行试验 在变换数据库字符集后 删掉原来的数据库emp表中的数据 插入正确的数据 保证源数据库中的数据是可用的 重新测试 然后把A机器上的数据库变换字符集 就是原来是中文的数据库我换成英文 原来是英文的数据库我换成中文 采用的方法是修改props$表 三 A机器上的数据库变换字符集后 C机器上导出操作 C机器是英文字符集 exp system/manager@ c file=c: c dmp owner=test exp system/manager@ e file=c: e dmp owner=test 都导出成功 发现上面两个文件的ACSII字符集都是 四 A机器上的数据库变换字符集后 C机器上导出操作 C机器是中文字符集 exp system/manager@ c file=c: c dmp owner=test exp system/manager@ e file=c: e dmp owner=test 都导出成功 发现上面两个文件的ACSII字符集都是 备份上面导出的 个数据文件 这时候修改上面导出的 个文件的ACSII字符集 进行中英文互换 把 和 互换 修改后的文件名都加了一个 _ 标记 小结 导出的时候 如果客户端和数据库的字符集设置不一致 导出的时候Oracle并没有提示 导出文件的ACSII字符集和客户端的字符集设置有关 与被导数据库字符集的设置无关 **************************************** **** 导入操作 **** **************************************** 一 向B的 c倒入操作 客户机D是英文字符集 D机器是英文字符集 B机器是中文数据库 imp system/manager@ c file=c: c dmp fromuser=test touser=test ignore=y C数据库字符集是中文 c dmp是英文客户端导出的中文数据库文件 ASCII字符集是英文的 导入成功 没有报错信息 但是不管用中文客户端还是用英文客户端SQL/PLUS访问 C 数据库是乱码(注意 乱码不是问号) 实际上导入失败 D机器是英文字符集 B机器是中文数据库 imp system/manager@ c file=c: c _ dmp fromuser=test touser=test ignore=y C数据库字符集是中文 c _ dmp是英文客户端导出的中文数据库文件 ASCII字符集是改成中文的 导入成功 没有报错信息 但是不管用中文客户端还是用英文客户端SQL/PLUS访问 C 数据库是乱码(注意 乱码不是问号) 实际上导入失败 D机器是英文字符集 B机器是中文数据库 imp system/manager@ c file=c: c dmp fromuser=test touser=test ignore=y C数据库字符集是中文 c dmp是中文客户端导出的中文数据库文件 ASCII字符集是中文的 导入成功 没有报错信息 但是不管用中文客户端还是用英文客户端SQL/PLUS访问 C 数据库是乱码(注意 乱码不是问号) 实际上导入失败 D机器是英文字符集 B机器是中文数据库 imp system/manager@ c file=c: c _ dmp fromuser=test touser=test ignore=y C数据库字符集是中文 c _ dmp是中文客户端导出的中文数据库文件 但是ASCII字符集是改成英文的 导入成功 没有报错信息 但是不管用中文客户端还是用英文客户端SQL/PLUS访问 C 数据库是乱码(注意 乱码不是问号) 实际上导入失败 D机器是英文字符集 B机器是中文数据库 imp system/manager@ c file=c: c dmp fromuser=test touser=test ignore=y C数据库字符集是中文 c dmp是英文客户端导出的英文数据库文件 但是数据库是换过的 ASCII字符集是英文的 导入成功 没有报错信息 但是不管用中文客户端还是用英文客户端SQL/PLUS访问 C 数据库是乱码(注意 乱码不是问号) 实际上导入失败 D机器是英文字符集 B机器是中文数据库 imp system/manager@ c file=c: c _ dmp fromuser=test touser=test ignore=y C数据库字符集是中文 c _ dmp是英文客户端导出的英文数据库文件 但是数据库是换过的 但是ASCII字符集是改成中文的 导入成功 没有报错信息 但是不管用中文客户端还是用英文客户端SQL/PLUS访问 C 数据库是???(注意 问号不是乱码) 实际上导入失败 D机器是英文字符集 B机器是中文数据库 imp system/manager@ c file=c: c dmp fromuser=test touser=test ignore=y C数据库字符集是中文 c dmp是中文客户端导出的英文数据库文件 但是数据库是换过的 导入成功 没有报错信息 但是不管用中文客户端还是用英文客户端SQL/PLUS访问 C 数据库是乱码(注意 乱码不是问号) 实际上导入失败 D机器是英文字符集 B机器是中文数据库 imp system/manager@ c file=c: c _ dmp fromuser=test touser=test ignore=y C数据库字符集是中文 c _ dmp是中文客户端导出的中文数据库文件 但是数据库是换过的 导入成功 没有报错信息 但是不管用中文客户端还是用英文客户端SQL/PLUS访问 C 数据库是乱码(注意 乱码不是问号) 实际上导入失败 D机器是英文字符集 B机器是中文数据库 imp system/manager@ c file=c: e dmp fromuser=test touser=test ignore=y C数据库字符集是中文 e dmp是英文客户端导出的英文数据库文件 ASCII字符集是英文的 导入成功 没有报错信息 但是不管用中文客户端还是用英文客户端SQL/PLUS访问 C 数据库是乱码(注意 乱码不是问号) 实际上导入失败 D机器是英文字符集 B机器是中文数据库 imp system/manager@ c file=c: e _ dmp fromuser=test touser=test ignore=y C数据库字符集是中文 e _ dmp是英文客户端导出的英文数据库文件 但是ASCII字符集是换成中文的 导入成功 没有报错信息 但是不管用中文客户端还是用英文客户端SQL/PLUS访问 C 数据库是???(注意 问号不是乱码) 实际上导入失败 D机器是英文字符集 B机器是中文数据库 imp system/manager@ c file=c: e dmp fromuser=test touser=test ignore=y C数据库字符集侵形模?e dmp是中文客户端导出的英文数据库文件 ASCII字符集是中文的 导入成功 没有报错信息 但是不管用中文客户端还是用英文客户端SQL/PLUS访问 C 数据库是乱码(注意 乱码不是问号) 实际上导入失败 D机器是英文字符集 B机器是中文数据库 imp system/manager@ c file=c: e _ dmp fromuser=test touser=test ignore=y C数据库字符集是中文 e _ dmp是中文客户端导出的英文数据库文件 但是ASCII字符集是换成英文的 导入成功 没有报错信息 但是不管用中文客户端还是用英文客户端SQL/PLUS访问 C 数据库是乱码(注意 乱码不是问号) 实际上导入失败 D机器是英文字符集 B机器是中文数据库 imp system/manager@ c file=c: e dmp fromuser=test touser=test ignore=y C数据库字符集是中文 e dmp是英文客户端导出的中文数据库文件 但是数据库是换过的 ASCII字符集是英文的 导入成功 没有报错信息 但是不管用中文客户端还是用英文客户端SQL/PLUS访问 C 数据库是???(注意 问号不是乱码) 实际上导入失败 D机器是英文字符集 B机器是中文数据库 imp system/manager@ c file=c: e _ dmp fromuser=test touser=test ignore=y C数据库字符集是中文 e _ dmp是英文客户端导出的中文数据库文件 但是数据库是换过的 但是ASCII字符集是换成中文的 导入成功 没有报错信息 但是不管用中文客户端还是用英文客户端SQL/PLUS访问 C 数据库是???(注意 问号不是乱码) 实际上导入失败 D机器是英文字符集 B机器是中文数据库 imp system/manager@ c file=c: e dmp fromuser=test touser=test ignore=y C数据库字符集是中文 e dmp是中文客户端导出的中文数据库文件 但是数据库是换过的 导入成功 没有报错信息 但是不管用中文客户端还是用英文客户端SQL/PLUS访问 C 数据库是???(注意 问号不是乱码) 实际上导入失败 D机器是英文字符集 B机器是中文数据库 imp system/manager@ c file=c: e _ dmp fromuser=test touser=test ignore=y C数据库字符集是中文 e _ dmp是中文客户端导出的中文数据库文件 但是数据库是换过的 但是ASCII字符集是换成英文的 导入成功 没有报错信息 但是不管用中文客户端还是用英文客户端SQL/PLUS访问 C 数据库是乱码(注意 乱码不是问号) 实际上导入失败 小结 导入的时候 如果客户端和数据库的字符集设置不一致 导入的时候Oracle并没有提示 导入的时候 如果客户端和数据库的字符集设置不一致 ORACLE不进行字符集验证 最终结果是数据库不可用 至于是乱码还是问号 我没有总结 因为没有必要 反正是数据库不可用 上面的操作其实没有必要做 因为导入的客户端和目的数据库字符集不一致 导入后肯定不能用 但是为了试验的完整性 我还是自己做了一遍 希望大家不要嫌烦 二 向B的 c倒入操作 客户机是中文字符集 D机器是中文字符集 B机器是中文数据库 imp system/manager@ c file=c: c dmp fromuser=test touser=test ignore=y C数据库字符集是中文 c dmp是英文客户端导出的中文数据库文件 ASCII字符集是英文的 提示 不支持要求的字符集转换 倒入失败 D机器是中文字符集 B机器是中文数据库 imp system/manager@ c file=c: c _ dmp fromuser=test touser=test ignore=y C数据库字符集是中文 c _ dmp是英文客户端导出的中文数据库文件 ASCII字符集是改成中文的 导入成功 有报错信息 但是不管用中文客户端还是用英文客户端SQL/PLUS访问 C 数据库是乱码(注意 乱码不是问号) 实际上导入失败 D机器是中文字符集 B机器是中文数据库 imp system/manager@ c file=c: c dmp fromuser=test touser=test ignore=y C数据库字符集是中文 c dmp是中文客户端导出的中文数据库文件 ASCII字符集是中文的 导入成功 有报错信息 但是不管用中文客户端还是用英文客户端SQL/PLUS访问 C 数据库是???(注意 问号不是乱码) 实际上导入失败 D机器是中文字符集 B机器是中文数据库 imp system/manager@ c file=c: c _ dmp fromuser=test touser=test ignore=y C数据库字符集是中文 c _ dmp是中文客户端导出的中文数据库文件 但是ASCII字符集是改成英文的 提示 不支持要求的字符集转换 倒入失败 D机器是中文字符集 B机器是中文数据库 imp system/manager@ c file=c: c dmp fromuser=test touser=test ignore=y C数据库字符集是中文 c dmp是英文客户端导出的英文数据库文件 但是数据库是换过的 ASCII字符集是英文的 提示 不支持要求的字符集转换 倒入失败 D机器是中文字符集 B机器是中文数据库 imp system/manager@ c file=c: c _ dmp fromuser=test touser=test ignore=y C数据库字符集是中文 c _ dmp是英文客户端导出的英文数据库文件 但是数据库是换过的 但是ASCII字符集是改成中文的 导入成功 有报错信息 用英文字符集客户端是??? 问号 用中文客户端是正确结果 可以看到中文 实际上导入成功 D机器是中文字符集 B机器是中文数据库 imp system/manager@ c file=c: c dmp fromuser=test touser=test ignore=y C数据库字符集是中文 c dmp是中文客户端导出的英文数据库文件 但是数据库是换过的 ASCII字符集是中文的 导入成功 有报错信息 但是不管用中文客户端还是用英文客户端SQL/PLUS访问 C 数据库是乱码(注意 乱码不是问号) 实际上导入失败 D机器是中文字符集 B机器是中文数据库 imp system/manager@ c file=c: c _ dmp fromuser=test touser=test ignore=y C数据库字符集是中文 c _ dmp是中文客户端导出的中文数据库文件 但是数据库是换过的 ASCII字符集是换成英文的 提示 不支持要求的字符集转换 倒入失败 D机器是中文字符集 B机器是中文数据库 imp system/manager@ c file=c: e dmp fromuser=test touser=test ignore=y C数据库字符集是中文 e dmp是英文客户端导出的英文数据库文件 ASCII字符集是英文的 提示 不支持要求的字符集转换 倒入失败 D机器是中文字符集 B机器是中文数据库 imp system/manager@ c file=c: e _ dmp fromuser=test touser=test ignore=y C数据库字符集是中文 e _ dmp是英文客户端导出的英文数据库文件 但是ASCII字符集是换成中文的 导入成功 有报错信息 用英文字符集客户端是??? 问号 用中文客户端是正确结果 可以看到中文 实际上导入成功 D机器是中文字符集 B机器是中文数据库 imp system/manager@ c file=c: e dmp fromuser=test touser=test ignore=y C数据库字符集是中文 e dmp是中文客户端导出的英文数据库文件 ASCII字符集是中文的 导入成功 有报错信息 但是不管用中文客户端还是用英文客户端SQL/PLUS访问 C 数据库是乱码(注意 乱码不是问号) 实际上导入失败 D机器是中文字符集 B机器是中文数据库 imp system/manager@ c file=c: e _ dmp fromuser=test touser=test ignore=y C数据库字符集是中文 e _ dmp是中文客户端导出的英文数据库文件 但是ASCII字符集是换成英文的 提示 不支持要求的字符集转换 倒入失败 D机器是中文字符集 B机器是中文数据库 imp system/manager@ c file=c: e dmp fromuser=test touser=test ignore=y C数据库字符集是中文 e dmp是英文客户端导出的中文数据库文件 但是数据库是换过的 ASCII字符集是英文的 提示 不支持要求的字符集转换 倒入失败 D机器是中文字符集 B机器是中文数据库 imp system/manager@ c file=c: e _ dmp fromuser=test touser=test ignore=y C数据库字符集是中文 e _ dmp是英文客户端导出的中文数据库文件 但是数据库是换过的 但是ASCII字符集是换成中文的 导入成功 有报错信息 但是不管用中文客户端还是用英文客户端SQL/PLUS访问 C 数据库是???(注意 问号不是乱码) 实际上导入失败 D机器是中文字符集 B机器是中文数据库 imp system/manager@ c file=c: e dmp fromuser=test touser=test ignore=y C数据库字符集是中文 e dmp是中文客户端导出的中文数据库文件 但是数据库是换过的 导入成功 有报错信息 用英文字符集客户端是??? 问号 用中文客户端是正确结果 可以看到中文 实际上导入成功 D机器是中文字符集 B机器是中文数据库 imp system/manager@ c file=c: e _ dmp fromuser=test touser=test ignore=y C数据库字符集是中文 e _ dmp是中文客户端导出的中文数据库文件 但是数据库是换过的 但是ASCII字符集是换成英文的 提示 不支持要求的字符集转换 倒入失败 小结 :导入的时候 只有当客户机和服务器的字符集一致的时候才进行倒入的字符集验证 当导入文件(DMP文件)的ASCII字符集和他们一致的时候才能导入 否则报:不支持要求的字符集转换 :必要条件是导出文件是可用的 就是说 导出的时候的客户端和服务器端的字符集是一致的 可以解释 和 的成功 : 的成功说明了就算是英文的数据库保存中文数据 在导出后修改DMP文件的字符集 还是可以导入到中文数据库中的 : 的成功说明了就算数据库是转换过的 但是还是可以正确导出中文数据的 : 的成功说明了就算是英文的数据库保存中文数据 在导出后修改DMP文件的字符集 还是可以导入到中文数据库中的 (即使这个英文数据库原来是中文的) :最不可理解的是 为什么不行 按道理说 它应该是最有把握的 三 向B的 e倒入操作(数据库是英文数据库) 客户机D是英文字符集 备注 客户机是中文字符集的情况其实不用测试了 因为客户机和服务器不一致 肯定出现问题 D机器是英文字符集 B机器是英文数据库 imp system/manager@ e file=c: c dmp fromuser=test touser=test ignore=y c dmp是英文客户端导出的中文数据库文件 ASCII字符集是英文的 导入成功 没有报错信息 但是不管用中文客户端还是用英文客户端SQL/PLUS访问 E 数据库是乱码(注意 乱码不是问号) 实际上导入失败 D机器是英文字符集 B机器是英文数据库 imp system/manager@ e file=c: c _ dmp fromuser=test touser=test ignore=y c _ dmp是英文客户端导出的中文数据库文件 ASCII字符集是改成中文的 导入成功 没有报错信息 但是不管用中文客户端还是用英文客户端SQL/PLUS访问 E 数据库是乱码(注意 乱码不是问号) 实际上导入失败 D机器是英文字符集 B机器是英文数据库 imp system/manager@ e file=c: c dmp fromuser=test touser=test ignore=y c dmp是中文客户端导出的中文数据库文件 ASCII字符集是中文的 导入成功 没有报错信息 但是不管用中文客户端还是用英文客户端SQL/PLUS访问 E 数据库是乱码(注意 乱码不是问号) 实际上导入失败 D机器是英文字符集 B机器是英文数据库 imp system/manager@ e file=c: c _ dmp fromuser=test touser=test ignore=y c _ dmp是中文客户端导出的中文数据库文件 但是ASCII字符集是改成英文的 导入成功 没有报错信息 但是不管用中文客户端还是用英文客户端SQL/PLUS访问 E 数据库是乱码(注意 乱码不是问号) 实际上导入失败 D机器是英文字符集 B机器是英文数据库 imp system/manager@ e file=c: c dmp fromuser=test touser=test ignore=y c dmp是英文客户端导出的英文数据库文件 但是数据库是换过的 ASCII字符集是英文的 导入成功 没有报错信息 用英文客户端SQL/PLUS访问 E 数据库是中文 实际上导入成功 D机器是英文字符集 B机器是英文数据库 imp system/manager@ e file=c: c _ dmp fromuser=test touser=test ignore=y > c _ dmp是英文客户端导出的英文数据库文件 但是数据库是换过的 但是ASCII字符集是改成中文的 导入成功 没有报错信息 用英文客户端SQL/PLUS访问 E 数据库是??? 倒入不成功 cha138/Article/program/Oracle/201311/18526相关参考
知识大全 利用RMAN转移数据和EXP/IMP转移的实测比较
利用RMAN转移数据和EXP/IMP转移的实测比较 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
巧妙转换ORACLE数据库字符集 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在大型数据库管理
知识大全 浅析Js(Jquery)中,字符串与JSON格式互相转换的示例
浅析Js(Jquery)中,字符串与JSON格式互相转换的示例 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来
这是一个简单的安全过滤函数了把转换字符转换成可以显示的文本了cha138/Article/program/net/201311/14079
Delphi开发经验技巧宝典:字符中的转换[4] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&n
Delphi开发经验技巧宝典:字符中的转换[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&n
Delphi开发经验技巧宝典:字符中的转换[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&n
Delphi开发经验技巧宝典:字符中的转换[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&n
以下是对php中的数组与字符串的转换函数进行了详细的整理汇总需要的朋友可以参考下 将一个字符串转化为数组str_split()用于将一个字符串转化为数组语法复制代码代码如下:str_sp
编码方案 编码和解码 数据压缩过程称为编码即将文件中的每个字符均转换为一个惟一的二进制位串 数据解压过程称为解码即将二进制位串转换为对应的字符 等长编码方案和变长编码方案 给定的字符集C