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.
Я ожидаю, что этот запрос получит что-то вроде, я имею в виду найти количество таких:
Но я ничего не понимаю, я имею в виду ноль. Что не так в коде? Я попробовал несколько вариантов, все одинаково не работают.
Решение
Это предмет 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
Кто-нибудь может подсказать, почему так срабатывает?
Версия 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$ или использовать аналогичный аналогичный «америка единый», хотя
Источник