踩坑mysql報錯MySQLSyntaxErrorException: Specified key was too long; max key length is 767 bytes

報錯信息:

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

這個是flowable引擎自動創建表的時候報的錯,建表語句如下:

CREATE TABLE flowable_test.ACT_ADM_SERVER_CONFIG (ID_ VARCHAR(255) NOT NULL, NAME_ VARCHAR(50) NULL, DESCRIPTION_ VARCHAR(255) NULL, SERVER_ADDRESS_ VARCHAR(100) NULL, PORT_ INT NULL, CONTEXT_ROOT_ VARCHAR(100) NULL, REST_ROOT_ VARCHAR(100) NULL, USER_NAME_ VARCHAR(100) NULL, PASSWORD_ VARCHAR(100) NULL, ENDPOINT_TYPE_ INT NULL, TENANT_ID_ VARCHAR(50) NULL, CONSTRAINT PK_ACT_ADM_SERVER_CONFIG PRIMARY KEY (ID_))

原因是myql用的是utf8mb4字符集,descirption_ 字段類型爲varchar255,長度爲256*4>767報錯了。

分析:創建索引時,有單列索引限制。上單列索引限制767,起因是256×3-1。這個3是字符最大佔用空間(utf8)。但是在5.5以後,開始支持4個字節的utf8mb4。255×4>767, 於是增加了一個參數叫做 innodb_large_prefix,這個參數默認值是OFF。當改爲ON時,允許列索引最大達到3072。
解決:

1.設置變量innodb_large_prefix innodb_file_format

SET GLOBAL innodb_large_prefix = ON;
SET GLOBAL innodb_file_format=Barracuda;


2.創建表的時候,增加語句:

ROW_FORMAT = DYNAMIC


測試數據庫版本:Server version: 5.6.35 MySQL Community Server (GPL)

到這裏flowable的問題就解決完了,後續還有個引申問題創建索引的限制。

索引列總長度的不能大於3072 bytes的限制。當把3個varchar255的字段合起來建索引會報錯,加下面這句就好了

SET GLOBAL innodb_file_per_table = ON;

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章