【问题标题】:How to escape the % and \ signs in pymysql using LIKE clause?如何使用 LIKE 子句转义 pymysql 中的 % 和 \ 符号?
【发布时间】:2019-09-29 12:24:12
【问题描述】:

我想在我的“事件”列中找到类似“概率:10%”或“10% 高”的内容,但是当我使用以下代码时:

conn = pymysql.connect(host="localhost", port=3306, user='myid', passwd='mypwd', db='mydb', charset='utf8')
curs = conn.cursor()

key = "%"
curs.execute(
        "SELECT count(*) AS number FROM city WHERE events LIKE %s",
        ("%" + key + "%",)
    )

它返回表中的每一行。它执行了这个查询:

  SELECT count(*) AS number FROM city WHERE events LIKE '%%%'

这样,我不是故意的。

搜索反斜杠符号也给了我不正确的结果。

我应该怎么做才能得到正确的结果?

提前致谢。

【问题讨论】:

  • MySQL 使用 C 风格的转义,因此要在字符串中获取反斜杠(在它被发送到 LIKE 之前),您需要两个反斜杠。试试SELECT count(*) AS number FROM city WHERE events LIKE '%\\%%'
  • 那么我是否需要定义一个新函数来转义该通配符?听说pymysql的execute函数转义了字符串,但是没有?
  • 确实如此,但像% 一样是一个特例。 pymysql 看不到您传入的 %s%s%s' 中的 % 符号之间的区别。

标签: python mysql pymysql


【解决方案1】:

您可以在 SQL 中使用 concat 并传递值,而不是参数中的 concat 通配符

 curs.execute(
    "SELECT count(*) AS number FROM city WHERE events LIKE CONCAT('%', %s, '%')",
     (key ,)
) 

或按照@Notinlist 的建议

curs.execute( "SELECT count(*) AS number FROM city WHERE events LIKE CONCAT('%%', %s, '%%')", (钥匙 ,) )

【讨论】:

  • 它给了我一个错误unsupported format character ''' (0x27) at index ...。解决方案是使用"SELECT ... LIKE CONCAT('%%', %s, '%%')"
  • @Notinlist .. 谢谢 ..answer 已更新您的建议
【解决方案2】:

你应该使用 SQL ESCAPE 子句:

curs.execute(
    "SELECT count(*) AS number FROM city WHERE events LIKE '%#%%' ESCAPE '#'"
)

【讨论】:

  • 所以pymysql中没有函数可以帮助转义'\'或'%'之类的单词?我想当使用字符串到执行函数的第二个参数时,pymysql会自动转义字符串。没有?
猜你喜欢
  • 2010-10-01
  • 2011-01-30
  • 2011-03-01
  • 2018-02-11
  • 1970-01-01
  • 2014-05-10
  • 1970-01-01
  • 2023-01-26
  • 1970-01-01
相关资源
最近更新 更多