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

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

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

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

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

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

Версия mySQL: 5.5.11
Character Set: utf8
  • Вопрос задан
  • 5004 просмотра
Пригласить эксперта
Ответы на вопрос 2
AterCattus
@AterCattus
Люблю быстрый backend
dev.mysql.com/doc/refman/5.5/en/regexp.html
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.
Ответ написан
vsespb
@vsespb
dev.mysql.com/doc/refman/5.5/en/regexp.html#operator_regexp

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 кодировках ни на какую мысль не натолкнуло.

www.fileformat.info/info/unicode/char/43c/index.htm
www.fileformat.info/info/unicode/char/201c/index.htm
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы