如何通过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字段,彻底避免乱码:
- 编写控制文件
image_load.ctl:
LOAD DATA INFILE * INTO TABLE JOB_DETAILS FIELDS TERMINATED BY ',' ( JOB_DATA LOBFILE('target_image.png') TERMINATED BY EOF )
- 执行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
相关产品推荐
相关产品推荐

