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

PHP使用OCI插入base64图片到Oracle LONG RAW列报ORA-01465错误

错误原因

  • Oracle的LONG RAW类型仅支持原生二进制数据存储,你传入的$image是Base64编码的文本字符串,Oracle解析时会尝试将文本内容转为十六进制数值,无法匹配就抛出ORA-01465: invalid hex number错误。
  • 你当前调用oci_bind_by_name时没有指定数据类型,OCI默认按字符串类型绑定参数,进一步导致Oracle无法识别传入的内容为二进制数据。

解决方案

  1. 先处理Base64数据:首先移除Base64字符串里的data URI前缀(如果有的话,比如data:image/jpeg;base64,),再用base64_decode()将Base64编码转为原生二进制数据。
  2. 绑定图片参数时指定数据类型为二进制类型SQLT_BIN,同时传入二进制数据的实际长度。

修改后的代码示例:

// 先处理Base64数据,去掉前缀后解码为二进制
$imageBin = base64_decode(preg_replace('#^data:image/\w+;base64,#i', '', $image));
$imageLength = strlen($imageBin);

$sql = "INSERT INTO id_images_student(ID, LENGTH, PICTURE, TYPE) VALUES (:stdId, :len, :img, :fType)";
$insData = oci_parse($conn, $sql);
oci_bind_by_name($insData, ':stdId', $stdId);
oci_bind_by_name($insData, ':len', $imageLength);
// 绑定二进制数据,指定长度和SQLT_BIN类型
oci_bind_by_name($insData, ':img', $imageBin, $imageLength, SQLT_BIN);
oci_bind_by_name($insData, ':fType', $fileType);
oci_execute($insData);

额外优化建议:Oracle的LONG RAW属于已被官方弃用的类型,后续版本兼容性较差,如果可以修改表结构,建议改用BLOB类型存储二进制文件,操作灵活性和稳定性更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 20:48:03