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无法识别传入的内容为二进制数据。
解决方案
- 先处理Base64数据:首先移除Base64字符串里的data URI前缀(如果有的话,比如
data:image/jpeg;base64,),再用base64_decode()将Base64编码转为原生二进制数据。 - 绑定图片参数时指定数据类型为二进制类型
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
相关产品推荐
相关产品推荐

