记一次Oracle数据迁移中文乱码问题
背景:公司打算将项目迁移到阿里云,从原来的服务器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