不同版本PostgreSQL中反斜杠行为差异及统一处理方案查询
跨PostgreSQL 8.3~9.6版本统一反斜杠处理的可行方案
无需修改实例配置,仅调整查询写法即可实现全版本行为统一:
- 方案1:使用ASCII码函数生成反斜杠
直接调用chr(92)表示单个反斜杠,该写法完全规避字符串转义规则差异,所有PostgreSQL版本行为完全一致。
示例:查询字段中包含反斜杠的记录,可统一写为:SELECT * FROM 表名 WHERE 字段名 LIKE '%'||chr(92)||'%'; - 方案2:统一使用转义字符串语法
PostgreSQL 8.2及以上版本均支持E'...'格式的转义字符串声明,无论全局配置的转义规则如何,该语法下的反斜杠都会被识别为转义字符。如果需要表示单个反斜杠,所有版本统一写E'\\'即可,返回结果固定为单个\。
示例:拼接带反斜杠的路径可统一写为:SELECT E'/mnt\\data\\' || 文件名 FROM 表名;
差异原因说明
你遇到的版本行为差异来自PostgreSQL的standard_conforming_strings配置参数:
8.x版本该参数默认关闭,普通单引号字符串内的反斜杠会被识别为转义符
9.1及之后版本该参数默认开启,普通单引号字符串内的反斜杠仅作为普通字符处理
上述两种方案都完全规避了该参数的影响,不需要先执行判断查询即可直接编写跨版本兼容的语句。
内容的提问来源于stack exchange,提问作者des
相关产品推荐
相关产品推荐

