单位有台老的8i的服务器挂了,手头只有之前日常备份下来的dmp文件。
在一台新的服务器安装了windows2008 + 11g , 默认字符集选用ZH16GBK, 然后用IMP导入8i的DMP , 发现能导入。只不过在导入的过程,IMP提示原导出服务器的字符集是UTF8的。
于是猜测应该把数据库字符集也改成UTF8的,才能保证原来的客户端也正常工作,手动改数据库字符集为UTF8,于是噩梦开始。做了多次尝试,总是导入时出错,大意提示“插入的字段值长度太大。。。”
经过百度,目前大概分析原因是:建表时分配的字段长度不足以存储UTF8的字符集。观察到imp时在建表阶段varchar2类型是用byte定义的, 于是做了个变通的处理:
1 先imp空表,此时没数据就不出错
2 用SQL Developer 导出建表SQL脚本,用查找/替换把"byte"统统替换成"char" ,
3 drop掉空表,用新的SQL脚本建表,新表的存储以char为单位,
4 imp导入数据,就没有错误提示了。
回过头来想,既然按原来表的定义,用byte不足以存储UTF8的数据,只能推断原来数据库用的不是UTF8,只是exp的时候被转换成了utf8,然而为什么dmp文件里会标识为UTF8呢?
另外是否oracle服务器的服务器和客户端字符集一定要一致呢?(因为看到有文章说可以不一样的,oracle会自动转换,如果这样我就没必要费大力气去调服务器的字符集)
本人刚接触,许多概念不清楚,望指点。
本帖最后由 超级慢打 于 2016-3-21 20:39 编辑
分享至: