![](/img/trans.png)
[英]How to insert a value that contains an apostrophe (single quote) in postgresql from java insert?
[英]How to: Mybatis query term with a single quote / apostrophe
我有一个搜索页面,该页面使用用户输入的术语来查询数据库。 我在Spring中使用Mybatis 3.4.0。
问题是Mybatis会删除搜索词中的任何单引号,无论我是否将其转义。 这些是有效的查询,因为用户需要能够搜索O'Toole之类的字符串,但不会返回任何内容。
这是映射器的代码片段。 有问题的字段是caseWhereConditionDTO.value
,传入的值例如是O''TOOLE
(在代码中O''TOOLE
手动转义)
<if test="caseWhereConditionDTO.value != null">
${caseWhereConditionDTO.leftExpression}
${caseWhereConditionDTO.operator}
#{caseWhereConditionDTO.value}
${caseWhereConditionDTO.closeConditionString}
</if>
这导致where子句
where UPPER(p.last_name ||', ' || p.first_name ) LIKE 'OTOOLE%'
缺少双逃脱的O'TOOLE
当我在映射器中将#替换为$并用单引号引起来时,一切正常
'${caseWhereConditionDTO.value}'
导致sql输出
where UPPER(p.last_name ||', ' || p.first_name ) LIKE 'O''TOOLE%'
给出预期的查询结果
但是我当然想保留#{}的sql注入保护
所以我的问题是,如何在仍使用#{} /预准备语句的sql注入保护的情况下查询带单引号的术语?
有两种无需转义单引号的选项:
除非确定输入将不包含任何%
输入,否则必须首先对其进行转义(如果它们存在于输入中并且不进行转义,则会对SQL造成混淆:输入的一部分是%
还是“ 运算符 ”?),然后将其串联%
到值: value = value + "%";
然后是LIKE #{value}
。
更好的选择是在SQL查询中连接%
: LIKE #{value} || '%'
LIKE #{value} || '%'
。 它确实有效,我刚刚对其进行了重新检查。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.