PostgreSQL 14.5 pg_read_binary_file读取部分文件报错Invalid argument求解决
问题描述
在Windows 10笔记本上安装PostgreSQL 14.5后,运行旧脚本通过pg_read_binary_file()函数向表中加载.jpg和.png格式图片时出现异常:
- 34个文件中仅5个处理成功(1个.jpg、4个.png)
- 其余29个文件执行时触发错误:
[Exception, Error code 0, SQLState XX000] ERROR: could not open file "文件绝对路径" for reading: Invalid argument - 成功执行示例:
select pg_read_binary_file('C:\Users\Jorge\OneDrive\Documents\000\020-logos\adalid.png') as adalid_png;
- 失败执行示例:
select pg_read_binary_file('C:\Users\Jorge\OneDrive\Documents\000\020-logos\oper.png') as oper_png;
- 已确认脚本在PostgreSQL 14早期版本可正常运行,暂无法找到早期版本测试。
可能的解决方案
1. 修正路径转义格式
Windows路径中的反斜杠\在PostgreSQL字符串中需转义,或改用正斜杠/,PostgreSQL 14.5对路径解析的严格性可能高于早期版本:
- 转义反斜杠写法:
select pg_read_binary_file('C:\\Users\\Jorge\\OneDrive\\Documents\\000\\020-logos\\oper.png') as oper_png;
- 改用正斜杠写法:
select pg_read_binary_file('C:/Users/Jorge/OneDrive/Documents/000/020-logos/oper.png') as oper_png;
2. 检查文件权限与OneDrive状态
- 给PostgreSQL服务运行账户(默认是
NT SERVICE\PostgreSQL)添加文件读取权限:右键目标文件→属性→安全→添加该账户并赋予读取权限。 - 确认失败文件已完成OneDrive同步(无同步中的加载图标),或临时将文件复制到本地非OneDrive目录测试。
3. 清除文件特殊属性
- 右键失败文件→属性→常规→取消勾选只读属性(若存在)。
- 检查文件是否开启加密:右键→属性→高级→取消勾选加密内容以便保护数据,PostgreSQL服务账户无法读取加密文件。
4. 解决Windows路径长度限制
Windows传统路径长度限制为260字符,若失败文件路径超出该长度:
- 缩短文件夹或文件名,减少路径总长度。
- 启用Win32长路径支持:打开组策略编辑器→计算机配置→管理模板→系统→文件系统→启用启用Win32长路径,重启系统后重试。
5. 替换为lo_import函数
若上述方法无效,尝试用PostgreSQL大对象导入函数lo_import替代,兼容性更好:
SELECT lo_import('C:/Users/Jorge/OneDrive/Documents/000/020-logos/oper.png');
后续可将返回的大对象OID转换为二进制数据插入表中。
内容的提问来源于stack exchange,提问作者Jorge Campins
相关产品推荐
相关产品推荐

