如何在正则表达式模式测试中添加标志?

时间:2018-11-28 08:21:06

标签: mysql sql regex utf-8 mysql-5.7

如何在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 'Ö';

使用正则表达式标志代替?

2 个答案:

答案 0 :(得分:1)

REGEXPRLIKE),在MySQL 8.0 / MariaDB 10.0之前不能处理UTF-8字符。它愚蠢地将Ö看作两个字节(十六进制)C396

带有重音符号(等)的正则表达式有时可以工作,但这更多是巧合。不要相信它。

使用VARCHARTEXT数据类型,以及=LIKE等和COLLATION,通常可以得到所需的内容。

如果包含Ö的列是CHARACTER SET utf8以外的 utf8mb4的{​​{1}}(或COLLATIONs),则“带有大写字母的大写字母O utf8_bin将至少等于所有这些值:

Ö

对于O=o=º=Ò=Õ=ò=õ=Ō=ō=Ŏ=ŏ utf8_hungarian_ciutf8_turkish_ci,但它们被视为不同的字母,在Ö=ö之后和O之前排序。

对于utf8_danish_ci,utf8_icelandic_ci和utf8_swedish_ci P,但是它们被视为不同的字母,紧跟Ö=ö之后。

另请参阅collation details

在几乎所有情况下,都应避免使用ZUPPER(),而不要让“排序规则”来完成这项工作。

另一个说明:任何以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