代码之家  ›  专栏  ›  技术社区  ›  Nae

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

  •  0
  • Nae  · 技术社区  · 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 'Ö';
    

    改为使用regexp标志?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Rick James diyism    7 年前

    REGEXP ( RLIKE ),在MySQL 8.0/MariaDB 10.0之前,不处理UTF-8字符。它呆呆地看着 Ö C3 96 .

    带有重音(等)字母的regexp有时也可以,但更多的是一种巧合。不要相信它。

    VARCHAR TEXT 数据类型,以及 = LIKE 等等,以及 COLLATION 你通常可以得到你需要的东西。

    如果列包含 CHARACTER SET utf8 utf8mb4 COLLATIONs 除了 utf8_bin ,即“带分音符的大写字母O” 至少所有这些都是相等的:

    O=o=º=Ò=Õ=ò=õ=Ō=ō=Ŏ=ŏ
    

    utf8_hungarian_ci ,和 utf8_turkish_ci Ö=ö ,但它们被视为不同的字母,在之后进行排序 O P .

    对于utf8_丹麦语、utf8_冰岛语和utf8_瑞典语 = ,但它们被视为一个不同的字母 Z

    collation details

    在几乎所有的情况下, 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 字符集utf8 以其默认值 ,正好是 utf8_general_ci .

        2
  •  0
  •   Barbaros Özhan    7 年前

    二进制排序规则 可用于:

    set @letter:='Ö';
    
    select 'ö' like binary @letter FalseResult, 
           'Ö' like binary @letter TrueResult;
    
    FalseResult TrueResult
    ----------- ----------
        0           1