Oracle BLOB转CLOB出现字符乱码问题

举报
福州司马懿 发表于 2023/02/24 17:49:03 2023/02/24
【摘要】 起因由于旧的业务采用的是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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。