2015-05-18 3 views
2

еще один MySQL LIKE поиск, который не возвращает ничегоMySQL Как искать специальные символы бежать

У меня есть содержание в моей БД MySQL, которые держат "\"

Однако я не могу найти их, как мой запрос возвращает либо ничего, либо слишком много элементов в зависимости от того, как я отформатирую подобный параметр.

Это Безразлично»reurns ничего:

SELECT element 
FROM `elements` 
WHERE body LIKE '%\\\'%' 
LIMIT 5 

Это возвращение почти все детали, потому что многие вещь держать одинарную кавычку полукокс

SELECT element 
FROM `elements` 
WHERE body LIKE '%\'%' 
LIMIT 5 

Это не работает:

SELECT element_id 
FROM `element_body` 
WHERE element_body LIKE '%|\|'%' ESCAPE'|' 
LIMIT 5 
+0

первый один * очень * близко. Это просто отсутствует другая обратная косая черта и другая одиночная цитата. Нужно быть ** четырьмя ** символами обратной косой черты и ** двумя ** одиночными кавычками "**' '% \\\\ ''% '' ** ". См. Мой ответ для демонстрации и более подробное объяснение. – spencer7593

+0

спасибо за вашу длинную обратную связь, это помогло много , однако мы не смогли сделать инструкцию LIKE '% \\\\' '%', поэтому мы использовали REGEX: SELECT * FROM elementbody WHERE elementbody REGEXP ' \\\\ '' ' и он сделал работу cheers –

+0

Я не уверен, почему 'LIKE'% \\\\ ''% '' не работал для вас, чтобы возвращать строки, содержащие "**' \ ''**" (буквальная обратная косая черта, сопровождаемая литеральной цитатой). Вот простая демонстрация, показывающая, что она работает: [** SQL Fiddle ** http://sqlfiddle.com/#!9/ a7199/1] (http://sqlfiddle.com/#!9/a7199/1). Те же правила, которые применяются к строковым литералам в LIKE, также применяются в 'REGEXP'. В более общем случае в шаблоне регулярных выражений есть гораздо больше «специальных символов», которые необходимо избегать. (Я предложил решение для 'LIKE', потому что это вопрос, заданный.) – spencer7593

ответ

0

Думаю, первый подход должен был работать.

This говорит, что \ должно быть заменено на '%\\%'.

Удалить «в первом запросе и повторите попытку!

+0

Это будет« соответствовать »строке, заканчивающейся знаком процента, например, это соответствовало бы« 2% ». OP хочет соответствовать символу обратной косой черты, за которым следует одиночный символ кавычек. – spencer7593

1

Возможно, вам потребуется использовать оператор REGEXP.

SELECT element FROM elements WHERE body RLIKE '%\\%' LIMIT 5 
2

Чтобы получить LIKE сравнение, чтобы соответствовать «\'» (буквальный символ обратной косой черты, за которыми следует апостроф, что может быть сделано, но это требует некоторого пристального внимания к побеге.

Самая большая проблема заключается в том, что MySQL использует символ обратной косой черты в строкового литерала как «побег» характер ... например \n представляет один символ новой строки.

Вот демонстрация.

SELECT t.foo 
     , t.foo LIKE '%\\\\''%' AS `match_` 
     FROM ( 
      SELECT 'abc\\''def' AS `foo` 
      UNION ALL SELECT 'gh\\i\\j' 
      UNION ALL SELECT 'k\\lm''n' 
      ) t 

Результаты сравнения LIKE возвращаются как вторая колонка. Значение 1 указывает TRUE, значение 0 указывает FALSE.)

foo  match_ 
    -------- ------ 
    abc\'def  1 
    gh\i\j   0 
    k\lm'n   0 

Давайте распаковать, что немного.

Чтобы представить одиночную кавычку в строковом литерале, нам нужно использовать две одинарные кавычки. В качестве примера:

SELECT 'I''m home' --> I'm home 

Чтобы получить обратной косой черты в строковый литерал, нам нужно два обратной косой черты. Первая обратная косая черта запускает обычную «escape-последовательность» MySQL, вторая обратная косая черта - это символ, который сбежал. Например:

SELECT 'a\\b'   --> a\b 

В LIKE сравнения, символ обратной косой черты считается «побег» характер.Мы использовали бы это до '%' или '_' (символ процента или подчеркивания, которые обычно интерпретируются как дикие карты), чтобы они интерпретировались как буквенные символы, которые мы хотим сопоставить.

Чтобы получить сравнение LIKE, чтобы соответствовать буквальному символу обратной косой черты, нам нужно символы обратной косой черты. Как мы только что продемонстрировали, для получения символа обратной косой черты в строковом литерале требуется два обратных косых черт. Поэтому нам нужно в общей сложности четыре символов обратной косой черты.

+0

Один символ кавычки также может быть «экранирован» с помощью обратного слэша, поэтому, вероятно, также будет работать серия * пятикратных обратных косых черт и * одной одинарной кавычки. (Подход * двух * одиночных кавычек к представлению одной котировки работает в других базах данных. Бизнес «backslash escape» в строковом литерале свойственен MySQL.) – spencer7593

 Смежные вопросы

  • Нет связанных вопросов^_^