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

问题描述 投票:0回答:2

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

用正则表达式标志代替?

mysql sql regex utf-8 mysql-5.7
2个回答
0
投票

二进制排序规则可能会被使用:

set @letter:='Ö';

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

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

0
投票

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
不能用于比较涉及的任何列,从而导致表扫描。

© www.soinside.com 2019 - 2024. All rights reserved.