如何在 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 'Ö';
用正则表达式标志代替?
二进制排序规则可能会被使用:
set @letter:='Ö';
select 'ö' like binary @letter FalseResult,
'Ö' like binary @letter TrueResult;
FalseResult TrueResult
----------- ----------
0 1
REGEXP
(RLIKE
),MySQL 8.0 / MariaDB 10.0 之前不处理 UTF-8 字符。 它愚蠢地将 Ö
视为两个字节(十六进制)C3
和 96
。
带有重音(等)字母的正则表达式有时会起作用,但这更多的是巧合。 不要相信它。
使用
VARCHAR
和 TEXT
数据类型,以及 =
、LIKE
等以及 COLLATION
,您通常可以获得所需的内容。
如果包含
Ö
的列是 CHARACTER SET utf8
(或 utf8mb4
),其中 most COLLATIONs
不是 utf8_bin
,则“带分音符号的大写字母 O”Ö
至少将比较所有这些值:
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
。
还有
在特定测试中指定排序规则的方法类似于:
SELECT 'This' = 'this' COLLATE utf8_bin --> 0
SELECT 'This' = 'this' COLLATE utf8_..._ci --> 1 ("ci" = case insensitive)
缺点是
INDEX
不能用于比较涉及的任何列,从而导致表扫描。