调用存储函数时如何处理单引号问题?
解决psql命令行调用函数时参数含单引号的语法错误问题
问题根源在于:shell解析psql的-c参数时,会提前识别单引号并闭合字符串,导致传到PostgreSQL的SQL语句已经语法错误,函数内部的quote_literal()根本没机会执行。
以下是几种可行的解决办法:
1. 使用psql变量传递(推荐)
利用psql的-v参数定义变量,让psql自动处理参数转义,完全避免手动替换单引号:
psql -h ### -X -U ### -d ### -t -v title="I t'ype anything" -c "select text from gettextfromtitle(:title) AS (text varchar);"
这种方式不仅解决了单引号问题,还能避免SQL注入风险。
2. 手动转义单引号(SQL标准方式)
如果必须直接在SQL字符串里写参数,按照SQL规范把参数中的单个单引号替换为两个单引号:
psql -h ### -X -U ### -d ### -t -c "select text from gettextfromtitle('I t''ype anything') AS (text varchar);"
这是你提到的方法,确实有效,本质是告诉PostgreSQL这个单引号是字符串内容的一部分,不是语句结束符。
3. 使用Here-Document简化shell解析
用here-doc方式传递SQL语句,减少shell对单引号的解析干扰,同时也可以结合shell变量替换自动转义:
# 直接写参数 psql -h ### -X -U ### -d ### -t <<EOF select text from gettextfromtitle('I t''ype anything') AS (text varchar); EOF # 如果参数是shell变量,自动转义单引号 title="I t'ype anything" psql -h ### -X -U ### -d ### -t <<EOF select text from gettextfromtitle('${title//\'/''}') AS (text varchar); EOF
内容的提问来源于stack exchange,提问作者Febraiz
相关产品推荐
相关产品推荐

