PostgreSQL:动态JSON拼接字符串时如何转义单引号?
解决PostgreSQL触发器中dblink传递含单引号JSON的语法错误问题
问题根源
直接拼接SQL字符串时,JSON内容里的单引号(比如{ "a": "It's a test" })会破坏SQL语句的引号闭合规则,引发语法报错,而动态数据无法手动逐个转义。
方案1:用quote_literal()自动转义
借助PostgreSQL内置的quote_literal()函数,自动把字符串中的单引号转为双单引号,同时为整个字符串添加外层单引号,彻底替代手动拼接引号的操作:
statement := 'INSERT INTO mytable(my_data) VALUES (' || quote_literal(my_json) || ')'; PERFORM dblink('my connection data', statement);
方案2:参数化查询(更安全,推荐)
使用dblink的参数传递功能,完全规避SQL字符串拼接操作,从根源解决转义问题,同时杜绝SQL注入风险:
PERFORM dblink('my connection data', 'INSERT INTO mytable(my_data) VALUES ($1)', ARRAY[my_json]::text[]);
这里用$1作为占位符,将my_json放入参数数组传递,dblink会自动处理参数的转义逻辑。
内容的提问来源于stack exchange,提问作者Mr.D
相关产品推荐
相关产品推荐

