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

varchar存储

存储格式
  1. varchar最大能存储的长度为65535字节
  2. 当varchar存储的字符个数小于或等于255的时候,首部需要1个字节来记录字符的个数。当内容大于255的字符的时候,首部需要2个字节来保存长度
能存的最大字符长度
  1. varchar能够存储65535个字节,但是由于首部会占用两个字节,因此这会让varchar可用的存储空间变成了65533字节。如果定义的列是非空,那最大是65533,如果定义的列允许NULL,那么null会占用1个额外的字节,因此最大只能存储65532个字节
  2. 字节并不等于字符长度,varchar(10)中varchar括号里面跟着的是字符长度,如果字符集是utf8的话,每一个字符统一会占用3个字节的长度,不管是汉子还是英文字符,因此最大能够存储的长度是65533/3 = 21844。如果字符集是utf8mb4那最大存储长度就更小了,为65533/4=16383

utf8与utf8mb4的区别

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

uft8mb4_general_ci与utf8mb4_unicode_ci的区别

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

例:

  1. 字符β在uft8mb4_general_ci校对规则下,被视为s,而在utf8mb4_unicode_ci下为ss,因此遇到该情况会出现排序不准确
  2. 一些Unicode字符被定义成可忽略的,即意味着在对含有这些字符的字符集排序的时候,该略过它们而继续向前移动进行操作

总结:

  1. utf8mb4_unicode_ci的算法更加复杂,其准确率高但是效率低,而uft8mb4_general_ci则相反
  2. 字符集若不会存在中文等亚洲语言或emoji符号等情况下,使用uft8mb4_general_ci,否则使用utf8mb4_unicode_ci
  3. 若不在乎数据库那点儿性能问题,建议选择utf8mb4_unicode_ci

索引长度限制

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

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

innodb_large_prefix=oninnodb_large_prefix=off
utf83072/3=1024767/3=255
utf8mb43072/4=768767/4=191
mysql8.0

在后期版本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版本以及相应的参数进行配置决定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值