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
.