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"

问题解决了。

总结,不同的情况多试试,不行就打印出运行环境的编码方式看看。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值