You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过SQL向Oracle表插入BLOB?粘贴字符出现乱码求助

解决Oracle插入BLOB图片时SQL字符乱码问题

直接在SQL里手动粘贴二进制转十六进制的字符,很容易因为编码、字符集不匹配出现乱码,试试下面几个实用方案:

方法1:用Oracle内置工具读取文件写入BLOB

借助UTL_FILE和DBMS_LOB直接读取图片文件,跳过手动粘贴字符的步骤:

DECLARE
  l_blob BLOB;
  l_file UTL_FILE.FILE_TYPE;
  l_buffer RAW(32767);
  l_amount BINARY_INTEGER := 32767;
BEGIN
  DBMS_LOB.CREATETEMPORARY(l_blob, TRUE);
  -- 替换为你的文件目录和文件名,需先创建目录并授权
  l_file := UTL_FILE.FOPEN('IMAGE_STORE_DIR', 'target_image.png', 'RB', 32767);
  
  LOOP
    UTL_FILE.GET_RAW(l_file, l_buffer, l_amount);
    DBMS_LOB.WRITEAPPEND(l_blob, LENGTH(l_buffer), l_buffer);
  END LOOP;
  
  INSERT INTO JOB_DETAILS (JOB_DATA) VALUES (l_blob);
  COMMIT;
  
  UTL_FILE.FCLOSE(l_file);
  DBMS_LOB.FREETEMPORARY(l_blob);
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    UTL_FILE.FCLOSE(l_file);
    DBMS_LOB.FREETEMPORARY(l_blob);
    COMMIT;
  WHEN OTHERS THEN
    IF UTL_FILE.IS_OPEN(l_file) THEN UTL_FILE.FCLOSE(l_file); END IF;
    DBMS_LOB.FREETEMPORARY(l_blob);
    RAISE;
END;
/

先执行以下语句创建目录并授权:

CREATE DIRECTORY IMAGE_STORE_DIR AS '/your/local/image/path';
GRANT READ ON DIRECTORY IMAGE_STORE_DIR TO your_db_user;

方法2:用SQL*Loader批量导入

通过控制文件关联图片文件,直接导入BLOB字段,彻底避免乱码:

  1. 编写控制文件image_load.ctl:
LOAD DATA
INFILE *
INTO TABLE JOB_DETAILS
FIELDS TERMINATED BY ','
(
  JOB_DATA LOBFILE('target_image.png') TERMINATED BY EOF
)
  1. 执行SQL*Loader命令:
sqlldr your_db_user/your_password@your_db_instance control=image_load.ctl

方法3:用编程语言生成标准十六进制字符串

如果一定要用HEXTORAW,用代码读取图片转成标准十六进制字符串再复制到SQL:
比如Python代码:

with open('target_image.png', 'rb') as img_file:
    hex_content = img_file.read().hex()
print(hex_content)

把输出的字符串复制到SQL中执行:

INSERT INTO JOB_DETAILS (JOB_DATA) VALUES (HEXTORAW('生成的十六进制字符串'));

内容的提问来源于stack exchange,提问作者Shabar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 11:25:58