将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,需要注意上面的情况.