mysql8编码方式对比_MySQL 8.0 字符串比较特殊案例小结

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

-- Padding space example

mysql> SELECT 'a' = 'a ', 'a' LIKE 'a ';

+------------+---------------+

| 'a' = 'a ' | 'a' LIKE 'a ' |

+------------+---------------+

| 1 | 0 |

+------------+---------------+

-- 注意:LIKE永远是按字符比较,因此PaddingSpace和特殊拉丁字母拆写('ä' = 'ae')的规则都不适用于LIKE计算。

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

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

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

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

-- Refer to ctype-latin1.cc

'ä' -> "ae"

'ö' -> "oe"

'ü' -> "ue"

'ß' -> "ss"

ai (不是自增主键的那个AI) refers accent insensitivity. That is, there is no difference between e, è, é, ê and ë when sorting. 对应相反的是as。

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

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

比较规则

binary collation

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

非binary的CHAR定长字符串类型

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

VARCHAR与VARCHAR比较

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

跨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获取长度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值