MySQL varchar存储、字符集、排序规则、索引长度

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL varchar存储、字符集、排序规则、索引长度相关的知识,希望对你有一定的参考价值。

参考技术A 由于历史原因,mysql刚开始设计的时候,"天真的"认为使用3个字节就足够存储字符串了,因此将UTF-8进行阉割;然而遇到复杂的汉字或者emoji表情等4字节的宽字符的时候,存储就会出现异常,因此在版本5.7.3开始引入utf8mb4,其表示为most bytes 4,即最多占用4个字节。

utf8mb4_unicode_ci是基于官方的Unicode规则进行排序和压缩,其算法相对负责,对于大部分的语言和字符集排序有着很高的准确率;而uft8mb4_general_ci可以理解为一种为了提升速度的简化版Unicode规则,但由于它不完全遵循Unicode规则,在使用某种特定语言或者字符集时,会出现非预期的结果。

例:

总结:

UTF-8编码的字符可以是1-4个字节,但是在MySQL中最大只能存储3个字节。

在版本5.5开始引入innodb_large_prefix,其默认值为off,索引的前缀最大限制为767个字节;若值为on时(版本5.7.7开始作为默认值),最大限制为3072个字节。
总结:

在后期版本 innodb_large_prefix 将会被逐渐废弃并移除。从版本8.0开始,索引长度限制由表字段(row format)决定,若为DYNAMIC或COMPRESSED时,限制值为3072;为REDUNDANT或COMPACT时,限制值为767。且row_format=dynamic时,长度3072是基于innodb_page_size=16KB,随着innodb_page_size的值按比例增减,其索引前缀长度也响应减小,如若为8KB时,长度为1536,因此在限制索引长度时,需根据使用的MySQL版本以及相应的参数进行配置决定。

以上是关于MySQL varchar存储、字符集、排序规则、索引长度的主要内容,如果未能解决你的问题,请参考以下文章

(转)mysql数据库中存储数字字段时,选择int和varchar的区别

mysql索引失效的情况以及left join关联字段字符集排序规则造成索引失效

mysql varchar 最大可以设置多少

修改MySql中数据表和字段的字符集和排序规则

字符集和排序规则会影响 MySQL/MariaDB 中的查询性能吗?

mysql 字符集 utf 8 排序规则(dup 键)无法正常工作