zoukankan      html  css  js  c++  java
  • MySQL 8.0 字符串比较特殊案例小结

    MySQL 8.0 字符串比较特殊案例小结

    Ref: https://dev.mysql.com/doc/refman/8.0/en/char.html

    Ref: https://dev.mysql.com/doc/refman/8.0/en/string-comparison-functions.html

    Ref: https://dev.mysql.com/doc/refman/8.0/en/charset-metadata.html

    PaddingSpace:指的是MySQL在某些场景下对字符串的padding部分用空格0x20 填充的方法

    -- Padding space example
    mysql> SELECT 'a' = 'a ', 'a' LIKE 'a ';
    +------------+---------------+
    | 'a' = 'a ' | 'a' LIKE 'a ' |
    +------------+---------------+
    |          1 |             0 |
    +------------+---------------+
    -- 注意:LIKE永远是按字符比较,因此PaddingSpace和特殊拉丁字母拆写('ä' = 'ae')的规则都不适用于LIKE计算。
    

    一些影响字符串比较的因素

    以下实现的时候是每个字符集自己的实现,基本都是用大数组来提前存好大小写的映射关系。

    1. CI (case insensitive),大小写不敏感。对应相反的是cs

    2. 特殊拉丁字母拆写('ä' = 'ae'),目前仅出现在latin1中,仅有如下实现。也是用两个combo数组实现他们的指向关系。

      -- Refer to ctype-latin1.cc
      'ä'  ->  "ae"
      'ö'  ->  "oe"
      'ü'  ->  "ue"
      'ß'  ->  "ss"
      
    3. ai (不是自增主键的那个AI) refers accent insensitivity. That is, there is no difference between e, è, é, ê and ë when sorting. 对应相反的是as

    4. 部分collation name会有数字代表着其字符集标准的编号或标准的版本。

    5. mb for multibytes,其中utf8是utf8mb3的别名,一般建议用更标准更全的utf8mb4。

    比较规则

    1. binary collation

      这个判断优先级最高,当一个字符串为binary时,不存在空格填充。CHAR定长类型用0x00填充。其他字符串无论原来collation和char类型,与binary比较时所有空格填充导致的规则全部失效,就是除去0x00部分的字符串裸比较。

    2. 非binary的CHAR定长字符串类型

      所有与这种CHAR比较都按PaddingSpace规则,不管比较字段是什么字符串类型或collation(当然除了binary)。

    3. VARCHAR与VARCHAR比较

      就只是字符串比较,无须赘述。

    4. 同charset不同collation:

      原则是遵循更严格的那个,比如cs > ci , as > ai 。xx_bin为最严格。

    5. 跨collation转换:

      utf8与非utf8:非utf8的会转为utf8,并按utf8的字符串的collation比较进行比较(包括ci、ai规则)MySQL认为所有其他charset都是utf8的子集,cs_to_uni也是用数组映射方式实现的。(UTF16和UTF32转UTF8会丢失信息)。

      两个非utf8的不同collation比较有可能会报错不支持。

      转换相关代码在 MY_CHARSET_HANDLER的mb_wc函数和mbcharlen函数。mb_wc用来转换,mbcharlen判断原始编码的字节长度,比较特殊的是UTF8mb3是1~3字节变长的,因此每次都要调用charlen获取长度。

  • 相关阅读:
    AspNet WebApi 中应用fo-dicom抛出异常:No codec registered for tranfer syntax:
    Codeforces Round #261 (Div. 2)459A. Pashmak and Garden(数学题)
    Android开发之使用Web Service进行网络编程
    线段树 + 扫描线加深具体解释
    对Shell几个冷知识的总结(IFS,数组,替换,分割,查找)
    lscript.ld 链接器脚本
    iOS 系统地图实现及定位
    Perl怎样过滤html标签
    hdu1213 How Many Tables(并查集)
    数据结构——链表
  • 原文地址:https://www.cnblogs.com/lhfcws/p/14879919.html
Copyright © 2011-2022 走看看