记一次Oracle数据迁移中文乱码问题

版权声明:欢迎大家一起来交流学习!转载注明出处即可。 https://blog.csdn.net/Mliangydy/article/details/82782920

背景:公司打算将项目迁移到阿里云,从原来的服务器Oracle数据库导出数据然后导入到本地服务器的Oracle数据库中,作为中转站,阿里云Oracle数据库安装完后再从本地数据库导出数据导入到阿里云中,导入阿里云后发现数据库中文乱码,一下便是处理数据库中文乱码的操作流程。(已知本地数据库无乱码)

一、查看本地Oracle数据库字符集

SQL:

select userenv('language') from dual;

可以发现Oracle数据库的字符集是 SIMPLIFIED CHINESE_CHINA.AL32UTF8

那么接下来就是要查看阿里云(客户端)的字符集了

二、查看阿里云客户端字符集

命令:locale

这里我们查看LANG的值就行了,为 zh_CN.UTF-8

三、查看zh_CN.UTF-8对应的字符集

我们可以看到对应的NLS_LANG字符集为 SIMPLIFIED CHINESE_CHINA.AL32UTF8

关于NLS_LANG:当我们设定一种nls的时候实际上我们是为oracle在存放数据时指定了他的语种所特有的一些表达形式,比如我们选择chinese,那么它的中文字符如何存放,按什么规则排序,货币如何表示,日期格式也就被设定了。

四、设置NLS_LANG的值

由上面已知,NLS_Lang的值决定着Oracle数据库存放数据的方式,这里恰好和本地数据库查出来的是一致的,如果不一致则以本地数据库的字符集为基准,对应的LANG、NLS_LANG也必须修改。

切换到Oracle用户:

su - oracle

echo $NLS_LANG

如果不是 SIMPLIFIED CHINESE_CHINA.AL32UTF8 则需要修改.bash_profile,一劳永逸

vi .bash_profile

修改NLS_LANG值 为 SIMPLIFIED CHINESE_CHINA.AL32UTF8

:wq #存盘退出

使.bash_profile文件生效

source .bash_profile

如果提示报错,请检查.bash_profile中ORA_NLS10的值

五、删除之前创建的Oracle用户及表空间

需要注意的是,你导入数据后再修改字符集是没用的,因为你导入时中文存储的方式就是你修改NLS_LANG的值的方式,所以需要将之前导入的数据清除,最好是清楚用户和表空间。

导入数据的权限问题请自行百度赋予用户有相应的权限

最后再导入数据到阿里云Oracle数据库后查询测试发现中文可以正常显示。

以上便是本次数据迁移发生的中文乱码的原因及处理方法。



六、总结

        通过本次经历,意识到数据迁移必须先检测双方的环境是否一致(数据库版本、字符集),一致方可进行迁移。

另外,数据迁移过程中数据丢失如何处理(比如丢失表)? 造成数据丢失的原因是什么?如何预处理?还有待思考!

参考文章:

https://www.cnblogs.com/guohu/p/7099393.html

https://www.cnblogs.com/bingo1717/p/7803359.html

https://www.cnblogs.com/justuntil/p/5636574.html

猜你喜欢

转载自blog.csdn.net/Mliangydy/article/details/82782920