如何在MySQL的正则表达式模式测试中添加标志?
貌似该模式对于某些unicode字符并不区分大小写,如:
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 'Ö';
使用正则表达式标志代替?
答案 0 :(得分:1)
REGEXP
(RLIKE
),在MySQL 8.0 / MariaDB 10.0之前不能处理UTF-8字符。它愚蠢地将Ö
看作两个字节(十六进制)C3
和96
。
带有重音符号(等)的正则表达式有时可以工作,但这更多是巧合。不要相信它。
使用VARCHAR
和TEXT
数据类型,以及=
,LIKE
等和COLLATION
,通常可以得到所需的内容。
如果包含Ö
的列是CHARACTER SET utf8
以外的 utf8mb4
的{{1}}(或COLLATIONs
),则“带有大写字母的大写字母O utf8_bin
将至少等于所有这些值:
Ö
对于O=o=º=Ò=Õ=ò=õ=Ō=ō=Ŏ=ŏ
和utf8_hungarian_ci
,utf8_turkish_ci
,但它们被视为不同的字母,在Ö=ö
之后和O
之前排序。
对于utf8_danish_ci,utf8_icelandic_ci和utf8_swedish_ci P
,但是它们被视为不同的字母,紧跟Ö=ö
之后。
在几乎所有情况下,都应避免使用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
。
答案 1 :(得分:0)
二进制排序规则 可能被使用:
set @letter:='Ö';
select 'ö' like binary @letter FalseResult,
'Ö' like binary @letter TrueResult;
FalseResult TrueResult
----------- ----------
0 1