把你的 MySQL 升級到 5.7,可以徹底解決這個問題!就是這麼簡單就解決了,但如果你不想升級,也有其他的解決辦法。

這個錯誤會產生是因為要 index 的欄位超過了 MySQL 對 index 的容量限制,在 5.7 以下,每張 Table 只能允許 767 bytes。

假設你的欄位型態 varchar 50 然後 utf8 編碼,這個欄位就佔了 150 bytes 的容量,如果要存 emoji 表情符號的話,那 50 就要乘 4 變成 200 bytes,不調整的話很容易就爆了。

調整方式,先連進 MySQL 後輸入以下指令


ALTER TABLE [tableName] ENGINE=InnoDB ROW_FORMAT=DYNAMIC;

編輯你的 my.cnf 增加以下設定


[mysqld]

innodb_large_prefix = 1
innodb_file_format = barracuda

接著重新啟動 MySQL 就可以了,調整後的大小可以支援到 3072 bytes,基本上你可以在已經運行的 Table 上做這個動作,資料不會遺失,但還是記得千萬要先備份,最後很遺憾的如果你的版本是 5.5 以下,就不支援這個方式喔,可以參考一下官網的說明:

Limits on InnoDB Tables