项目中最近遇到个比较头疼的问题,因为使用了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,索性拿来先试试,然后就顺利解决了。。


友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信