Oracle-blob转字符串遇到中文乱码的问题

项目中最近遇到个比较头疼的问题,因为使用了Liferay平台,使用封装后的hql查询导致取不出来数据库中的blob字段,无奈之下只好换个思路:直接在数据库这边先把blob字段转成字符串

但脚本执行后发现,转出来的竟然是乱码。。最头疼的就是各种编码不同导致的乱码问题了,搜了搜,刚好看到一篇帖子讨论这个问题,研究了下之后终于能转成正常的中文了,可以用两种写法:

select convert(UTL_RAW.CAST_TO_VARCHAR2(blob_field), 'zhs16gbk', 'AL32UTF8') from test_blob;

select UTL_RAW.CAST_TO_VARCHAR2(UTL_RAW.CONVERT(blob_field, 'AMERICAN_AMERICA.zhs16gbk', 'AMERICAN_AMERICA.AL32UTF8')) from test_blob;


blob转字符串是用了UTL_RAW.CAST_TO_VARCHAR2()函数,转码可以用CONVERT()和UTL_RAW.CONVERT()两个函数,帖子里小灰狼大大解释了函数的参数:CONVERT()函数相比之下就不需要加英文字符集了)
3个参数,utl_raw.convert(a,b,c),b为当前数据库可识别的字符集,可以从nls_database_parameters中查看,c为当前2进制数据存储使用的字符集。该函数将a从字符集c转换到字符集b。字符集参数要写全,比如'AMERICAN_AMERICA.US7ASCII','.'前面为英文字符集,后面为中文字符集。


参数b倒还方便查,但参数c真是让人头疼了不少,首先就是真的不知道存进去的时候用了什么字符集,其次就是完全不懂Oracle有哪些常见的字符集。。光从zhs16gbk来看就知道和平时常见的utf-8啊,gb2312啊,iso8859-1啊之类的不是一样的格式


没办法,帖子里刚好出现了其中的两个:AL32UTF8和US7ASCII,索性拿来先试试,然后就顺利解决了。。


关于Oracle的字符集找到一篇较为详细的博客,有空可以再学习研究下

你可能感兴趣的:(数据库)