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

zpgglvta  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(283)

如何在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标志代替?

gpnt7bae

gpnt7bae1#

可以使用二进制排序规则:

set @letter:='Ö';

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

FalseResult TrueResult
----------- ----------
    0           1
35g0bw71

35g0bw712#

REGEXP ( RLIKE ),之前的mysql 8.0/mariadb 10.0不处理utf-8字符。它默默地看着我 Ö 作为两个字节(十六进制) C3 以及 96 .
带有重音(etc)字母的regexp有时是有效的,但更多的是巧合。别相信它。
VARCHAR 以及 TEXT 数据类型,以及 = , LIKE 等,以及 COLLATION 你通常能得到你需要的。
如果列包含 ÖCHARACTER SET utf8 (或 utf8mb4 )与大多数 COLLATIONsutf8_bin ,带分音符的大写字母o Ö 将至少比较所有这些:

O=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 'Ö'; ,我说:

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 .

相关问题