在新建數據庫或者導入別人的數據庫腳本的時候會出現Specified key was too long; max key length is 767 bytes
錯誤。這是由於數據庫建立索引的時候索引的數據過長導致的。
在MySQL數據庫中系統變量innodb_large_prefix開啟了,則對於使用DYNAMIC或COMPRESSED行格式的InnoDB表,索引鍵前綴限制為3072字節。如果禁用innodb_large_prefix,不管是什么表,索引鍵前綴限制為767字節。
上述的bug很明顯是索引超出了限制的長度767(我的數據庫innodb_large_prefix禁用了):
我發現報錯的那張表建立了一個varchar類型的索引,varchar(255),覺得沒什么問題,其實不然,上述的767是字節,而varchar類型是字符,同時我發現我使用的字符集為(utf8mb4),這個指每個字符最大的字節數為4,所以很明顯 4*255 > 767
所以就報上述錯了(Specified key was too long; max key length is 767 bytes)。
解決方法:
-
改變varchar的字符數,我改成了64就可以了。varchar(64)
-
啟用innodb_large_prefix,那么限制值會增加到3072
mysql> set global innodb_file_format = BARRACUDA;
Query OK, 0 rows affected (0.00 sec)
mysql> set global innodb_large_prefix = ON;
Query OK, 0 rows affected (0.00 sec)