数据库 \ Oracle \ 【Oracle11g】小记乱码问题

【Oracle11g】小记乱码问题

总点击25
简介:Oracle乱码是个老难题,涉及到各个终端字符集的转码,想要了解清楚这个问题需要储备的知识点太多了,需要了解字符集之间的兼容性,有超级的说法。这里就不详述此类问题了,牵扯的太多。

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跟数据库服务端字符集一致。

意见反馈 常见问题 官方微信 返回顶部