Oracle BLOB转CLOB出现字符乱码问题
【摘要】 起因由于旧的业务采用的是BLOB方案,而新的架构采用的是CLOB存储,因此要进行一个转换,但是取出来之后,发现中文变乱码了。其中,转换代码如下CREATE OR REPLACE FUNCTION BlobToClob(blob_in IN BLOB) RETURN CLOB AS v_clob CLOB; v_varchar VARCHAR2(4000); v_st...
起因
由于旧的业务采用的是BLOB方案,而新的架构采用的是CLOB存储,因此要进行一个转换,但是取出来之后,发现中文变乱码了。
其中,转换代码如下
CREATE OR REPLACE FUNCTION BlobToClob(blob_in IN BLOB) RETURN CLOB AS
v_clob CLOB;
v_varchar VARCHAR2(4000);
v_start PLS_INTEGER := 1;
v_buffer PLS_INTEGER := 4000;
BEGIN
DBMS_LOB.CREATETEMPORARY(v_clob, TRUE);
FOR i IN 1 .. CEIL(DBMS_LOB.GETLENGTH(blob_in) / v_buffer) LOOP
v_varchar := UTL_RAW.CAST_TO_VARCHAR2( DBMS_LOB.SUBSTR(blob_in, v_buffer, v_start));
DBMS_LOB.WRITEAPPEND(v_clob, LENGTH(v_varchar), v_varchar );
v_start := v_start + v_buffer;
END LOOP;
RETURN v_clob;
END BlobToClob;
分析 —— 字符应该需要转换
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’
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’,’.'前面为英文字符集,后面为中文字符集。
最后修改后的代码如下
CREATE OR REPLACE FUNCTION BlobToClob(blob_in IN BLOB) RETURN CLOB AS
v_clob CLOB;
v_varchar VARCHAR2(4000);
v_start PLS_INTEGER := 1;
v_buffer PLS_INTEGER := 4000;
BEGIN
DBMS_LOB.CREATETEMPORARY(v_clob, TRUE);
FOR i IN 1 .. CEIL(DBMS_LOB.GETLENGTH(blob_in) / v_buffer) LOOP
v_varchar := UTL_RAW.CAST_TO_VARCHAR2( convert(DBMS_LOB.SUBSTR(blob_in, v_buffer, v_start), 'ZHS16GBK', 'UTF8'));
DBMS_LOB.WRITEAPPEND(v_clob, LENGTH(v_varchar), v_varchar );
v_start := v_start + v_buffer;
END LOOP;
RETURN v_clob;
END BlobToClob;
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)