Как добавить флаги в тесты шаблонов регулярных выражений? - PullRequest
0 голосов
/ 28 ноября 2018

Как добавить флаги в тесты шаблонов регулярных выражений в MySQL?

Кажется, что шаблон не чувствителен к регистру для некоторых символов Юникода, как в:

SELECT
  UPPER('ö') REGEXP 'Ö' TrueResult,
  'ö' REGEXP 'Ö' FalseResult
;

Возвращает:

TrueResult  FalseResult
    1           0

Принимая во внимание:

SELECT
  UPPER('o') REGEXP 'O' TrueResult,
  'o' REGEXP 'O' FalseResult
;

возвращает:

TrueResult  FalseResult
    1           1

Так, например, как написать эквивалент:

SELECT UPPER('ö') REGEXP 'Ö';

с помощью регулярного выраженияфлаги вместо?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

REGEXP (RLIKE), до MySQL 8.0 / MariaDB 10.0 не обрабатывает символы UTF-8.Он тупо смотрит на Ö как два байта (шестнадцатеричные) C3 и 96.

Регулярные выражения с акцентированными (и т. Д.) Буквами иногда работают, но это скорее совпадение.Не верьте этому.

С типами данных VARCHAR и TEXT, вместе с =, LIKE и т. Д. И COLLATION вы обычно можете получить то, что вам нужно.

Если столбец, содержащий Ö, равен CHARACTER SET utf8 (или utf8mb4) с большинством COLLATIONs, отличными от utf8_bin, то "ПИСЬМО ЗАГЛАВНОЙ С ДИАРЕЗИСОМ" Ö будет сравниваться равнымпо крайней мере, все из них:

O=o=º=Ò=Õ=ò=õ=Ō=ō=Ŏ=ŏ

Для utf8_hungarian_ci и utf8_turkish_ci, Ö=ö, но они обрабатываются как разные буквы, сортируя после O и до P.

Для utf8_danish_ci, utf8_icelandic_ci и utf8_swedish_ci Ö=ö, но они рассматриваются как разные буквы после Z.

См. Также сведения о сопоставлении

Практически во всех случаях следует избегать UPPER() и LOWER(), вместо того, чтобы позволить "сопоставлению" выполнять свою работу.

Еще одно примечание: любое имя сопоставления, заканчивающееся на_ci означает «нечувствительный к регистру» и «нечувствительный к акценту».

Что касается вопроса «как написать эквивалент: SELECT UPPER('ö') REGEXP 'Ö';,Я говорю:

mysql> SET NAMES utf8;
Query OK, 0 rows affected (0.01 sec)

mysql> SELECT 'ö' = 'Ö';
+-------------+
| 'ö' = 'Ö'   |
+-------------+
|           1 |
+-------------+
1 row in set (0.00 sec)

* * * * * * * * * * * SET NAMES просто для того, чтобы указать, что я использую CHARACTER SET utf8 с его значением по умолчанию COLLATION, которое получается utf8_general_ci.

0 голосов
/ 28 ноября 2018

Двоичное сопоставление может использоваться:

set @letter:='Ö';

select 'ö' like binary @letter FalseResult, 
       'Ö' like binary @letter TrueResult;

FalseResult TrueResult
----------- ----------
    0           1
...