Specified key was too long; max key length is 767 bytes错误的原因
将mysql
数据库里某个UNIQUE
唯一索引字段从utf8
改为utf8mb4
时提示1071 - Specified key was too long; max key length is 767 bytes
,来看看这个错误的来原因。
来几个知识点
- 一个字符
latin1
占用1 bytes
,utf8
占用3 bytes
,而utf8mb4
占用4 bytes
; - 在
mysql5.6
以及以前的版本的InnoDB
引擎的表限制索引最多占用767 bytes
;而MyISAM
的是最长1000 bytes
。 - 从
mysql5.7
版本开始这个限制提升到3072 bytes
,UTF8
可以达到VARCHAR(1024)
;
所以当你的唯一索引字段在mysql5.6
或更早的版本时(引擎为InnoDB
),utf8mb4
字符串最长能到VARCHAR(191)
(1914=764),utf8
可以到VARCHAR(255)
(255·3=765)。如果你从不指定长度直接使用utf8mb4
字段做唯一索引,就会报Specified key was too long; max key length is 767 bytes
错误,因为计算默认字符串默认长度时是255。
这个问题在Laravel
中就有可能发生,为了存储emoji
它默认使用utf8mb4
,如果你的mysql版本低于5.7,需要注意上面的情况.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)