數據庫索引過長(Specified key was too long; max key length is 767 bytes)


在新建數據庫或者導入別人的數據庫腳本的時候會出現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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM