Oracle blob字段中文乱码
项目中,有些业务数据存放在blob类型的字段中,常遇到的一个问题就是中文乱码。本人参与的一个项目,在windows环境下,中文正常显示,有一天切换到了Linux服务器上,同样的代码,竟然出现了中文乱码。乱码并不可怕,解决方式无非是统一编码。于是乎,先查看了一下用的Oracle数据库的字符集
select * from nls_database_parameters where parameter ='NLS_CHARACTERSET';
查询结果是ZHS16GBK,也就是对应GBK编码。又在网上查了下资料,说windows默认GBK编码,Linux默认UTF-8,怪不得在window环境下没事,Linux环境下就乱码了。问题原因搞清楚了,下一步着手解决。
是改数据库编码呢还是改服务器编码呢?分析了下,Oracle改默认编码很麻烦而且还可能有隐患,并且我的项目还跟别的项目共用一个数据库,安全起见还是改服务器编码吧。
Linux系统版本:CentOS release 6.9 (Final)
先输入命令:locale
果然都是UTF-8,尝试了下面方法:
/root/.bash_profile文件的末尾添加以下两行命令:
export LC_ALL="zh_CN.GBK"
export LANG="zh_CN.GBK"
重新启动服务器后,重新输入命令:locale
很高兴的发现都变成了GBK,以为搞定了,结果做了下测试还是乱码,百思不得其解。又试了些别的法,也不行,无奈先在项目启动后追加些打印环境编码的代码看看吧:
System.out.println("Default Charset=" + Charset.defaultCharset());
System.out.println("file.encoding=" + System.getProperty("file.encoding"));
System.out.println("Default Charset=" + Charset.defaultCharset());
System.out.println("Default Charset in Use=" + getDefaultCharSet());
private static String getDefaultCharSet() {
OutputStreamWriter writer = new OutputStreamWriter(new ByteArrayOutputStream());
String enc = writer.getEncoding();
return enc;
}
果然,打印出来的结果还是UTF-8
又找了个方法试了试:
修改 /etc/sysconfig/i18n 文件
修改为:
LANG="zh_CN.GBK"
SUPPORTED="zh_CN.UTF-8:zh_CN:zh"
SYSFONT="latarcyrheb-sun16"
修改完后,执行:source i18n,再测试,成功解决。本以为这样的问题都能这么解决的,后来在公司的开发服务器上又试了一把,结果不好使。
公司服务器版本:Red Hat Enterprise Linux Server release 6.4 (Santiago)
最后又用了下面的方法:
在/etc/profile文件的最后一行添加如下内容:
export LANG="zh_CN.GBK"
export LC_ALL="zh_CN.GBK"
问题解决了。
总结,不同的情况多试试,不行就打印出运行环境的编码方式看看。
更多推荐
所有评论(0)