Mysql не работает regexp

REGEXP с MySQL не работает должным образом

Если я хочу найти все данные со строкой léon в name поле, я использую запрос как это:

Этот запрос в порядке.

Теперь мне нужно получить все строки со строкой léon или же leon или же lèon вот я и попробовал:

Этот запрос не работает. У меня нет ошибки, но нет результата. Есть ли у вас какие-либо идеи?

2 ответа

Однако, если вы используете UTF-8, вместо этого вы можете использовать нечувствительный к акценту LIKE а также = поиски, которые выглядят так, как будто это то, что вам действительно нужно в любом случае.

Операторы REGEXP и RLIKE работают побайтово, поэтому они не являются многобайтовыми и могут давать неожиданные результаты с многобайтовыми наборами символов. Кроме того, эти операторы сравнивают символы по их байтовым значениям, и акцентированные символы могут не сравниваться как равные, даже если данное сопоставление рассматривает их как равные.

То, что вы можете попробовать, это обработать многобайтовый символ, например, таким образом, чтобы он обрабатывал 1 байт или 2. Он не будет идеальным, потому что он подойдет, например, для «льва», но может приблизить вас.

Еще одна вещь, которая может повлиять на вас, — это то, как REGEXP работает в MySQL, это то, что в конце есть подразумеваемые символы подстановки, потому что вы не указываете начало и конец, так что

Это означает, что вы можете соответствовать больше, чем вы ожидаете. Похоже, ваша проблема — первый сценарий, о котором я упоминаю

Источник

mysql — REGEXP не работает должным образом внутри скрипта PHP

У меня есть эта проблема с mysql при запросе БД внутри PHP.

Я ожидаю, что этот запрос получит что-то вроде, я имею в виду найти количество таких:

Читайте также:  Как правильно настроить швейную машину brother

Но я ничего не понимаю, я имею в виду ноль. Что не так в коде? Я попробовал несколько вариантов, все одинаково не работают.

Решение

Это предмет Unicode персонажи.

Что происходит то e,é,è,ê,ë.. в вашем примере это не одна буква, а 2, потому что тильда также считается символом. Это приносит много сложностей и правил, которые необходимо соблюдать, чтобы соответствовать правилам Юникода.

Вы могли бы сделать что-то вроде: ([\x<0049>-\x<0130>]) искать буквы с тильдами, но это выражение может варьироваться в зависимости от того, собираетесь ли вы использовать это выражение в .net, java, javascript или php.

Вы также можете проверить, какой код представляет каждый символ:

Другие решения

Согласно официальному Веб-сайт спецификация, регулярное выражение MySQL сопоставляется побайтовым способом

Операторы REGEXP и RLIKE сравнивают символы по
значения байтов и акцентированные символы могут не совпадать, даже если
данное сопоставление рассматривает их как равные.

Если вы можете сопоставить любой символ вместо [eéèêë] , этого должно быть достаточно:

  • колонны CHARACTER SET является utf8 или же utf8mb4 , а также
  • Ваше соединение между клиентом и сервером MySQL также является одним из этих наборов символов, а также
  • вы не используете COLLATION utf8_bin , затем

WHERE . = . а также WHERE . LIKE . будет соблюдать вышеизложенное. REGEXP ( RLIKE ) не могут быть использованы по причинам, которые уже обсуждались.

это показывает, что равно (для = а также LIKE .)

Если вы просто ищете строку для Dom-Remy использовать

и вместо регулярного выражения / rlike

Если у вас есть что-то более сложное, что нужно REGEXP , а затем начать новый вопрос с деталями.

Источник

Неправильно отрабатывает regexp в mySQL

Пытался фильтровать данные с помощью операции:
SELECT *
FROM posts
WHERE text REGEXP ‘[а-яА-Я]’

По идее должен был вернуть все посты где есть русские буквы, но он вернул и немного лишних. Пока разбирался, наткнулся на следующую оказию:

SELECT ‘“’ REGEXP ‘[М]’;
возвращает 1

Коды символов
ord(‘М’) = 53404 («М» — русская буква)
ord(‘“’) = 14844060

Читайте также:  Как настроить часы fit smart

Кто-нибудь может подсказать, почему так срабатывает?

Версия mySQL: 5.5.11
Character Set: utf8

  • Вопрос задан более трёх лет назад
  • 4910 просмотров

Warning
The REGEXP and RLIKE operators work in byte-wise fashion, so they are not multi-byte safe and may produce unexpected results with multi-byte character sets. In addition, these operators compare characters by their byte values and accented characters may not compare as equal even if a given collation treats them as equal.

The REGEXP and RLIKE operators work in byte-wise fashion, so they are not multi-byte safe and may produce unexpected results with multi-byte character sets. In addition, these operators compare characters by their byte values and accented characters may not compare as equal even if a given collation treats them as equal.

Почему именно этот регэксп совпадает — не знаю. По идее для этого нужно точно знать внутреннее представление всех данных в mysql и реализацию.

Байтовое представление этих символов в различных unicode кодировках ни на какую мысль не натолкнуло.

Источник

REGEXP с MySQL не работает должным образом

Если я хочу найти все данные со строкой léon в name поле, я использую запрос как это:

Этот запрос в порядке.

Теперь мне нужно получить все строки со строкой léon или же leon или же lèon вот я и попробовал:

Этот запрос не работает. У меня нет ошибки, но нет результата. Есть ли у вас какие-либо идеи?

2 ответа

Однако, если вы используете UTF-8, вместо этого вы можете использовать нечувствительный к акценту LIKE а также = поиски, которые выглядят так, как будто это то, что вам действительно нужно в любом случае.

Операторы REGEXP и RLIKE работают побайтово, поэтому они не являются многобайтовыми и могут давать неожиданные результаты с многобайтовыми наборами символов. Кроме того, эти операторы сравнивают символы по их байтовым значениям, и акцентированные символы могут не сравниваться как равные, даже если данное сопоставление рассматривает их как равные.

То, что вы можете попробовать, это обработать многобайтовый символ, например, таким образом, чтобы он обрабатывал 1 байт или 2. Он не будет идеальным, потому что он подойдет, например, для «льва», но может приблизить вас.

Читайте также:  Как открыть шампанское если пробка сломалась пополам штопором

Еще одна вещь, которая может повлиять на вас, — это то, как REGEXP работает в MySQL, это то, что в конце есть подразумеваемые символы подстановки, потому что вы не указываете начало и конец, так что

Это означает, что вы можете соответствовать больше, чем вы ожидаете. Похоже, ваша проблема — первый сценарий, о котором я упоминаю

Источник

Поиск регулярного выражения mysql не работает

Я пытаюсь выполнить это, но он бросает ошибку. Кто-нибудь может помочь?

1064 — У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с ‘regex’ ^ ab $ ‘LIMIT 0, 30’ в строке 1

Мой девиз — получить запись » Соединенные Штаты Америки «, в то время как пользователь ищет любую фразу типа

Соединенные Штаты/Соединенные Штаты/государства объединенные/Соединенные Штаты Америки/Соединенные Штаты Америки

Может кто-нибудь, пожалуйста, скажите мне, как я могу написать регулярное выражение для этого требования.

Но Like работает отлично с

Любая помощь приветствуется.

Попробуйте использовать REGEXP вместо REGEX . 😉

В дополнение к тому, что отметил sp00m, достаточно уверен, что ваше регулярное выражение не то, что вы ищете. ^ и $ соответствуют началу и концу строки соответственно, поэтому с помощью этих регулярных выражений:

эффективно ищет точное совпадение на «ab» и «United States». Если вы ищете запрос, like ‘%ab%’ , удалите символы начала и конца строки, ваше регулярное выражение просто будет:

Я действительно задаюсь вопросом, что было не так с использованием LIKE ‘%ab%’ . Похоже, это более типичный метод.

Тем не менее, ни один из вариантов не заставит регулярные выражения united states или » ^united states$ или использовать аналогичный аналогичный «америка единый», хотя

Источник

Оцените статью