MySQL 8.0 字符串比较特殊案例小结
2021/6/13 19:23:25
本文主要是介绍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计算。
一些影响字符串比较的因素
以下实现的时候是每个字符集自己的实现,基本都是用大数组来提前存好大小写的映射关系。
-
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比较
就只是字符串比较,无须赘述。
-
同charset不同collation:
原则是遵循更严格的那个,比如cs > ci , as > ai 。xx_bin为最严格。
-
跨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获取长度。
这篇关于MySQL 8.0 字符串比较特殊案例小结的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-29阿里 Canal 实时同步 MySQL 增量数据至 ClickHouse 数据库
- 2024-05-24在Linux下管理MySQL的大小写敏感性
- 2024-04-26MySQL查出时间比实际晚8小时的解决方案
- 2024-04-01JPA不识别MySQL的枚举类型
- 2024-03-30mysql数据库表卡死解决方法
- 2024-03-15MySQL多数据源笔记5-ShardingJDBC实战
- 2024-03-11natural join mysql
- 2024-03-11关于VS2017,VS2015 中利用 EF使用Mysql 不显示数据源问题解决方案
- 2024-02-26mysql 阿里云xb后缀备份文件恢复-icode9专业技术文章分享
- 2024-02-22docker mysql 5.7