如何在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 'Ö';
用regexp标志代替?
2条答案
按热度按时间6rqinv9w1#
可以使用二进制排序规则:
5sxhfpxr2#
REGEXP
(RLIKE
),之前的mysql 8.0/mariadb 10.0不处理utf-8字符。它默默地看着我Ö
作为两个字节(十六进制)C3
以及96
.带有重音(etc)字母的regexp有时是有效的,但更多的是巧合。别相信它。
与
VARCHAR
以及TEXT
数据类型,以及=
,LIKE
等,以及COLLATION
你通常能得到你需要的。如果列包含
Ö
是CHARACTER SET utf8
(或utf8mb4
)与大多数COLLATIONs
除utf8_bin
,带分音符的大写字母oÖ
将至少比较所有这些:为了
utf8_hungarian_ci
,和utf8_turkish_ci
,Ö=ö
,但它们被视为不同的字母,在O
在那之前P
.对于utf8\u丹麦语\u ci、utf8\u冰岛语\u ci和utf8\u瑞典语\u ci
Ö=ö
,但它们被视为另一封信,紧随其后Z
.另请参见排序规则详细信息
在几乎所有情况下,
UPPER()
以及LOWER()
应该避免优先让“排序”做这项工作。另请注意:任何以
_ci
表示“不区分大小写”和“不区分重音”。至于“如何写出等价于:
SELECT UPPER('ö') REGEXP 'Ö';
,我说:这个
SET NAMES
只是指出我在使用CHARACTER SET utf8
默认情况下COLLATION
,正好是utf8_general_ci
.