Oracle数据库字符集转换规律全面剖析

人为了活着还o6

人为了活着还o6

2016-01-29 14:44

Oracle数据库字符集转换规律全面剖析,Oracle数据库字符集转换规律全面剖析

    作为一个Oracle数据库的用户,对于Export和Import两个命令绝对不会感到陌生,因为这二者正是我们经常用于数据备份和恢复的工具。但在使用这两个命令过程中所发生的Oracle字符集问题,常给一些Oracle使用者带来不必要的麻烦和不必要的数据损失。本文将就Export和Import过程中Oracle字符集的转换规律及使用这两个命令的注意事项做一总结。

字符集转换的原因


 

  
    Export、Import过程如上图所示,从这个示意图中可以看到有四处关系到字符集,而这四处字符集的不一致恰恰是导致Oracle进行字符集转换的原因。

* 源数据库字符集;

* Export过程中用户会话字符集;

* Import过程中用户会话字符集;

* 目标数据库字符集。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com)

  在Export和Import过程中,如果存在影响字符集转换的四因素不一致,则可能发生Oracle字符集转换,即:

    在Export过程中,如果源数据库字符集与Export用户会话字符集不一致,会发生字符集转换,并在导出的二进制格式Dmp文件的头部几个字节中存储Export用户会话字符集的ID号。在这个转换过程中可能发生数据的丢失。

    例1: 如果源数据库使用ZHS16GBK,而Export用户会话字符集使用US7ASCII,由于ZHS16GBK是8位字符集,而US7ASCII是7位字符集,这个转换过程中,中文字符在US7ASCII中不能够找到对等的字符,所以所有中文字符都会丢失而变成“?? ”形式,即这种转换后生成的Dmp文件已经发生了数据丢失。

    例2: 如果源数据库使用ZHS16GBK,而Export用户会话字符集使用ZHS16CGB231280,但由于ZHS16GBK字符集是ZHS16CGB231280字符集的超集,这个过程中绝大部分字符都能够正确转换,只有一些超出ZHS16CGB231280字符集的字符变为“?? ”形式。如果源数据库使用ZHS16CGB231280字符集,而Export用户会话使用ZHS16GBK字符集,则转换过程能够完全转换成功。

[next]

   在Import向目标数据库转换过程中,其字符集发生转换的情况正好与Export过程相反,这里不再详述。

    在Export导出的Dmp文件中,含有Export用户会话字符集。在Import过程中,首先发生的是Dmp文件字符集(即Export用户会话字符集)向Import用户会话字符集的转换。如果这个转换过程不能正确完成,Import向目标数据库的导入过程也就不能完成。

进行字符集的正确转换

    通常情况下,我们在使用Oracle的Export和Import过程中,并不希望发生字符的转换,但有时这种转换却是必要的。如我们在安装Oracle 数据库时,选择ZHS16CGB231280字符集,由于这种字符集是一种中文小字符集,对于一些汉字不能够正确表示,这需要通过使用ZHS16GBK字符集得到解决,此时就要进行字符集的转换。

    为了确保Export、Import过程中,Oracle字符集不发生转换或正确转换,建议最好在进行这个过程前,检查一下源数据库字符集与Export 用户会话字符集是否一致,源数据库字符集与目标数据库字符集是否一致,目标数据库字符与Import用户会话字符集是否一致。如果能够保证这四个字符集是一致的,则在Export、Import过程中,Oracle字符集就不用发生转换。

可用以下办法检查数据库字符集:

通过InitXXXX.ora文件进行查看;

借助SQL语句查看: SELECT NAME,VALUE$ FROM SYS.PROPS$ WHERE NAME=‘NLS_CHARACTERSET’。

    对于Export、Import用户会话字符集,在Windows系统中也可以通过注册表中的NLS_LANG进行查看或修改,对于Unix系统则可通过设置用户的环境变量NLS_LANG来查看或修改。

    特别要注意的是,Oracle数据库字符集通常是在创建时确定,一旦存储用户数据后就不要再修改了,因为其数据都是使用该字符集进行存储的,改换其他字符集之后,原有数据就不能够正确表示了。但如果确实想进行字符集改变,则可通过以下几步来实现:

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com)

备份数据库后删除原数据(可物理备份,如使用Export,请注意确保字符集不发生转换或数据无损失);

使用Internal用户更新sys.props$表中的字符集:


Update sys.props$ set name=‘Dest.CharSet’
Where name=‘NLS_CHARACTERSET’; COMMIT;
 

重启数据库;

恢复数据。

下面字符集之间的转换是可行的:

    字符集子集向字符集父集转换是可行的,如ZHS16CGB231280向ZHS16GBK转换;而字符集父类向字符集子集进行转换时,会损失部分数据。

    只包含英文字符

展开更多 50%)
分享

猜你喜欢

Oracle数据库字符集转换规律全面剖析

电脑网络
Oracle数据库字符集转换规律全面剖析

Mysql 数据库字符集转换及版本升级/降级的详细教程

MySQL mysql数据库
Mysql 数据库字符集转换及版本升级/降级的详细教程

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

在不同字符集的数据库之间导入数据的方法

电脑网络
在不同字符集的数据库之间导入数据的方法

Oracle Faq(Oracle的字符集问题)

Web开发
Oracle Faq(Oracle的字符集问题)

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Oracle 数据库操作技巧集

编程语言 网络编程
Oracle 数据库操作技巧集

HTML 字符集

Web开发
HTML 字符集

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

用PHP实现通过Web执行C/C++程序

用PHP实现通过Web执行C/C++程序

《刀塔传奇》攻略之非土豪70及以前玩家指南

《刀塔传奇》攻略之非土豪70及以前玩家指南
下拉加载更多内容 ↓