Добрый вечер. В БД у меня строки вида Foo\bar Foo\baz ... Почему в sql запросе надо по четыре слеша указывать чтобы работало? Select * from table1 where field like 'Foo\\\\b%' Это тот запрос, который и в консоли mysql набираю и в phpmyadmin. Это не строка в php, где нужно ещё его экранирование учитывать.
Сначала экранирование PHP-строк, потом экранирование строковых значений для мускула. --- Добавлено --- Для мускула лучше спец. ф-цию экранирования использовать или подготовленные запросы.
Какой спец. символ?! Ему нужно сделать LIKE 'Foo\b%' --- Добавлено --- Где b – начало слов bar, baz и т.п. --- Добавлено --- echo '\\\\' дает на выходе два слеша, которые в тексте запроса являются одним проэкранированным слешем
@Drunkenmunky, что за привычка тыкать в ман вместо того чтобы понять, что тебе пишут! Экранировать нужно всегда, чтобы не было неожиданностей вроде появления спец. символов, съедания бэк слешей и т.п. --- Добавлено --- Т.е. даже если бы использовалась буква, для которой (сейчас) нет соов. спец. символа, все равно нужно писать в данной ситуации четыре слеша, а не два.
ОК Изменяем строку Foo\bar на Foo\dar Тогда корректный запрос будет выглядеть так Код (Text): Select * from table1 where field like 'Foo\\d%' Так достаточно вежливо?
@Drunkenmunky, да, сам по себе текст запроса должен содержать два слеша (один проэкранированный), но в PHP-строке (прописанной в исходном коде) – четыре, о чем и написал ТС.
Это мне? Походу мы оба не правы. В строках после оператора LIKE бэкслеш имеет спец. значение даже после обработки основным парсером. Т.е. слеш должен представляться четырьмя слешами (речь об обратных слешах), если он не последний в строке (если последний, его можно обозначать и двумя, и четырьмя слешами – об этом написано в том же замечании). Т.е. в явно прописанных строках после оператора LIKE бэкслеш нужно экранировать дважды. И это только для самого мускула. --- Добавлено --- Что касается спец. символов, можно и \b, и \\b. В первом случае экранирование выполняется под основной парсер, а во втором экранируется бэкслеш под основной парсер, чтобы получилась эск. последовательность \b, которую распознает спец. парсер LIKE.
Ясно, в общем это связано с особенностями выражения у like, теперь нашел это в доках. Как то раньше не замечал, но php код у меня норм работает, фреймворк видимо знает, а вот в консоль зашел, подчистить, и не работает