MySQL 5.7 提示Specified key was too long; max key length is XXX bytes問題詳解

前幾日在MySQL執(zhí)行一條update語句時報錯,報錯信息如下:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 
Specified key was too long; max key length is 1024 bytes

通過搜索查到有很多類似的報錯例子,區(qū)別只是在于有的是3072 bytes,有的是768bytes,于是總結(jié)了此類問題出現(xiàn)的原因和解決方案。
出現(xiàn)此類問題的原因都是在于InnoDB 表引擎的限制,默認情況下,索引前綴長度限制為 767 字節(jié),當(dāng)開啟了 innodb_large_prefix 選項時,索引前綴長度擴展到 3072 字節(jié)。


image.png

除此之外,索引前綴長度還和 InnoDB 的 page size 有關(guān)。innodb_page_size 選項默認是 16KB 的時候,最長索引前綴長度是 3072 字節(jié),如果是 8KB 的時候,最長索引前綴長度是 1536 字節(jié),
默認是3KB的時候,是1024字節(jié),默認是4KB 的時候,是 768 字節(jié)。


image.png

然后我們再查看先按選用的字符集的字節(jié)占用情況:
SHOW CHARACTER SET;

結(jié)果太多我就不貼執(zhí)行結(jié)果的截圖了。
如果表的字符集是 utf8mb4 時,一個字符將占用 4 個字節(jié)。這意味著索引前綴最大長度為 3072 字節(jié)時,只能容納 3072 / 4 = 768 個字符;如果字符是utf8,一個字符將占用 3 個字節(jié)。這意味著索引前綴最大長度為 3072 字節(jié)時,只能容納 3072 / 3 = 1024 個字符;其余字符集同理。
此時問題的解決方案只需要在建立索引時指定索引前綴長度:

CREATE INDEX idx_xxx ON table (columns(768) ASC);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容