Как избежать знаков% и \ ​​в pymysql, используя предложение LIKE?

Я хочу найти что-то вроде «вероятность: 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 '%%%'

вот так, чего я не собирался.

Поиск знака обратной косой черты также дал мне неправильные результаты.

Что мне делать, чтобы получить правильный результат?

Заранее спасибо.


person Park    schedule 12.05.2019    source источник
comment
MySQL использует экранирование в стиле C, поэтому, чтобы получить обратную косую черту в строке (до того, как она будет отправлена ​​​​в LIKE), вам нужны две обратные косые черты. Попробуйте SELECT count(*) AS number FROM city WHERE events LIKE '%\\%%'   -  person Nick    schedule 12.05.2019
comment
stackoverflow.com/questions/5020130/   -  person thebjorn    schedule 12.05.2019
comment
Итак, мне нужно определить новую функцию, чтобы избежать этих подстановочных знаков? Я слышал, что функция выполнения pymysql экранирует строку, но это не так?   -  person Park    schedule 12.05.2019
comment
это так, но, как и в случае с %, это особый случай. pymysql не видит разницы между знаками % в '%s%s%s', которые вы передаете.   -  person thebjorn    schedule 12.05.2019


Ответы (2)


вместо concat подстановочный знак в параметре вы можете использовать concat в SQL и передать значение

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

или как предложено @Notinlist

curs.execute (ВЫБЕРИТЕ количество (*) КАК число ИЗ города, ГДЕ события КАК CONCAT ('%%', %s, '%%'), (ключ,) )

person scaisEdge    schedule 12.05.2019
comment
Мне выдало ошибку unsupported format character ''' (0x27) at index .... Решение состояло в том, чтобы использовать "SELECT ... LIKE CONCAT('%%', %s, '%%')" - person Notinlist; 05.02.2021
comment
@Notinlist .. спасибо .. ответ обновлен с учетом вашего предложения - person scaisEdge; 05.02.2021

Вы должны использовать предложение SQL ESCAPE:

curs.execute(
    "SELECT count(*) AS number FROM city WHERE events LIKE '%#%%' ESCAPE '#'"
)
person reartnew    schedule 12.05.2019
comment
так что в pymysql нет функции, которая помогает избежать слова, такого как «\» или «%»? Я думал, что при использовании строки для второго параметра функции excute pymysql автоматически экранирует строку. это не так? - person Park; 12.05.2019