【Oracle11g】小记乱码问题

Oracle乱码是个老难题,涉及到各个终端字符集的转码,想要了解清楚这个问题需要储备的知识点太多了,需要了解字符集之间的兼容性,有超级的说法。这里就不详述此类问题了,牵扯的太多。
环境:
服务器 rhel 6.8
dump 文件
plsql dev工具

一般的做法都是把dmp文件上传到服务器,然后远程CRT登录到服务器,sqlplus 登录到数据库执行脚本。
这里需要了解几个终端的字符集:
1、dmp字符集 ,这里可以通过文件编译器转换dmp文本编码集,我这里设置的是utf8。
2、CRT 终端字符集,我设置的是utf8
3、服务器字符集 ,LANG=en_us
4、数据库客户端字符集,也就是sqlplus 字符集,sqlplus字符集一般都是按照系统NLS_LANG设置,我这里是ZHS16GBK
5、数据库字符集 ,可以通过select * fromv$nls_parameters;来查询,我这里设置的是AL32utf8。

使用CRT工具登录到远程服务器,所以如果想查看dmp文件,那么这里就需要设置CRT字符集,不然会乱码。
服务器字符集en_us,这里在显示中文字符的时候会使用这个参数,一般推荐使用en_us.utf8设置。
按照以上步骤设置完,最起码在服务器上查看dmp文件不会有问题,但是这并不代表插入到数据库就正常,这里牵扯到转码的问题,超级转子集正常,子集转超级就会乱码。
如果数据库已有的中文字符集,在客户端可以正常查看,因为zhs16gbk 转utf8可以正常转换,如果UTF8转换gbk就会出问题。
总之一个原则:保证客户端,服务端编码集一致,确保数据库客户端nls_lang跟数据库服务端字符集一致。

猜你喜欢

转载自blog.csdn.net/a743044559/article/details/80818639