pgcrypto命令输出非标准含大量反斜杠,是否安装错误?
别担心,这不是pgcrypto安装错误导致的——其实是PostgreSQL处理二进制数据输出的显示格式问题,属于很常见的小配置项差异~
pgcrypto的encrypt()和digest()函数默认返回的是bytea(二进制数据)类型,而PostgreSQL通过bytea_output参数控制这类数据的显示方式:
- 当参数设为
escape(默认值)时,会把非打印字符转义成反斜杠开头的八进制/特殊字符,就会出现你看到的4Y\026'\371\310\352\344\027\374|\273\364XY,这类格式; - 当参数设为
hex时,就会输出你预期的\x开头的十六进制字符串格式。
解决步骤
第一步:先检查当前的
bytea_output设置,执行命令:SHOW bytea_output;大概率会返回
escape。第二步:修改输出格式
- 临时生效(仅当前数据库连接有效):
SET bytea_output = 'hex'; - 永久生效(所有新连接都适用):找到PostgreSQL的配置文件
postgresql.conf,修改bytea_output = 'hex',然后重启PostgreSQL服务或执行SELECT pg_reload_conf();重载配置。
- 临时生效(仅当前数据库连接有效):
第三步:验证效果
重新执行你的加密命令:select encrypt('123456789012345','1234','aes');现在就能得到预期的
\x34591627f9c8eae417fc7cbbf458592c格式输出了。
关于digest的额外小技巧
如果使用digest()时想直接获取纯十六进制字符串,除了修改bytea_output,还可以用encode()函数直接转换结果,不受配置参数影响:
SELECT encode(digest('your_content', 'sha256'), 'hex');
内容的提问来源于stack exchange,提问作者Greg Rowles
相关产品推荐
相关产品推荐

