За последние 24 часа нас посетили 20357 программистов и 1089 роботов. Сейчас ищут 809 программистов ...

Экранирование

Тема в разделе "MySQL", создана пользователем marlin, 30 сен 2021.

  1. marlin

    marlin Новичок

    С нами с:
    19 июн 2019
    Сообщения:
    61
    Симпатии:
    3
    Добрый вечер.
    В БД у меня строки вида
    Foo\bar
    Foo\baz
    ...

    Почему в sql запросе надо по четыре слеша указывать чтобы работало?
    Select * from table1 where field like 'Foo\\\\b%'

    Это тот запрос, который и в консоли mysql набираю и в phpmyadmin.
    Это не строка в php, где нужно ещё его экранирование учитывать.
     
  2. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.789
    Симпатии:
    646
    Сначала экранирование PHP-строк, потом экранирование строковых значений для мускула.
    --- Добавлено ---
    Для мускула лучше спец. ф-цию экранирования использовать или подготовленные запросы.
     
  3. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Достаточно двух. Обычно.
    Но не в вашем примере.
    \b - спецсимвол, точнее - их последовательность.
     
  4. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.789
    Симпатии:
    646
    Какой спец. символ?! Ему нужно сделать LIKE 'Foo\b%' ;)
    --- Добавлено ---
    Где b – начало слов bar, baz и т.п.
    --- Добавлено ---
    echo '\\\\' дает на выходе два слеша, которые в тексте запроса являются одним проэкранированным слешем ;)
     
  5. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
  6. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.789
    Симпатии:
    646
    @Drunkenmunky, что за привычка тыкать в ман вместо того чтобы понять, что тебе пишут! Экранировать нужно всегда, чтобы не было неожиданностей вроде появления спец. символов, съедания бэк слешей и т.п.
    --- Добавлено ---
    Т.е. даже если бы использовалась буква, для которой (сейчас) нет соов. спец. символа, все равно нужно писать в данной ситуации четыре слеша, а не два.
     
    #6 miketomlin, 30 сен 2021
    Последнее редактирование: 30 сен 2021
  7. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    ОК
    Изменяем строку Foo\bar на Foo\dar
    Тогда корректный запрос будет выглядеть так
    Код (Text):
    1. Select * from table1 where field like 'Foo\\d%'
    Так достаточно вежливо?
     
  8. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.789
    Симпатии:
    646
    @Drunkenmunky, да, сам по себе текст запроса должен содержать два слеша (один проэкранированный), но в PHP-строке (прописанной в исходном коде) – четыре, о чем и написал ТС.
     
    #8 miketomlin, 30 сен 2021
    Последнее редактирование: 30 сен 2021
  9. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
     
  10. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.789
    Симпатии:
    646
    @Drunkenmunky, нашел в мане примечание по этому поводу.
     
  11. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Красавчик, чо
     
  12. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.789
    Симпатии:
    646
    Это мне?

    Походу мы оба не правы. В строках после оператора LIKE бэкслеш имеет спец. значение даже после обработки основным парсером. Т.е. слеш должен представляться четырьмя слешами (речь об обратных слешах), если он не последний в строке (если последний, его можно обозначать и двумя, и четырьмя слешами – об этом написано в том же замечании). Т.е. в явно прописанных строках после оператора LIKE бэкслеш нужно экранировать дважды. И это только для самого мускула.
    --- Добавлено ---
    Что касается спец. символов, можно и \b, и \\b. В первом случае экранирование выполняется под основной парсер, а во втором экранируется бэкслеш под основной парсер, чтобы получилась эск. последовательность \b, которую распознает спец. парсер LIKE.
     
    #12 miketomlin, 30 сен 2021
    Последнее редактирование: 30 сен 2021
    marlin нравится это.
  13. marlin

    marlin Новичок

    С нами с:
    19 июн 2019
    Сообщения:
    61
    Симпатии:
    3
    Ясно, в общем это связано с особенностями выражения у like, теперь нашел это в доках.
    Как то раньше не замечал, но php код у меня норм работает, фреймворк видимо знает, а вот в консоль зашел, подчистить, и не работает