Mysql: Specified key was too long; max key length is 1000 bytes


在使用quartz持久化的時候,筆者使用的mysql,為了以后方便遷移數據,筆者的Mysql默認引擎MyISAM

於是順理成章的執行了quartz-2.2.3\docs\dbTables\tables_mysql.sql

這不數據庫就開始報錯了

[Err] 1071 - Specified key was too long; max key length is 1000 bytes

原始sql語句

CREATE TABLE QRTZ_JOB_DETAILS
  (
    SCHED_NAME VARCHAR(120) NOT NULL,
    JOB_NAME  VARCHAR(200) NOT NULL,
    JOB_GROUP VARCHAR(200) NOT NULL,
    DESCRIPTION VARCHAR(250) NULL,
    JOB_CLASS_NAME   VARCHAR(250) NOT NULL,
    IS_DURABLE VARCHAR(1) NOT NULL,
    IS_NONCONCURRENT VARCHAR(1) NOT NULL,
    IS_UPDATE_DATA VARCHAR(1) NOT NULL,
    REQUESTS_RECOVERY VARCHAR(1) NOT NULL,
    JOB_DATA BLOB NULL,
    PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
);

 

即便考慮到是不是utf-8字節長度問題,修改成以下仍舊報錯

CREATE TABLE QRTZ_JOB_DETAILS
  (
    SCHED_NAME VARCHAR(120) NOT NULL,
    JOB_NAME  VARCHAR(200) NOT NULL,
    JOB_GROUP VARCHAR(200) NOT NULL,
    DESCRIPTION VARCHAR(250) NULL,
    JOB_CLASS_NAME   VARCHAR(250) NOT NULL,
    IS_DURABLE VARCHAR(1) NOT NULL,
    IS_NONCONCURRENT VARCHAR(1) NOT NULL,
    IS_UPDATE_DATA VARCHAR(1) NOT NULL,
    REQUESTS_RECOVERY VARCHAR(1) NOT NULL,
    JOB_DATA BLOB NULL,
    PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
)ENGINE=MyISAM DEFAULT CHARSET=utf8;

官方也沒有說明原因:只是很委婉的說推薦用innodb

PLEASE consider using mysql with innodb tables to avoid locking issues

經過一番搜索找到了原因,【求助】mysql:Specified key was too long; max key leng

以下是搬運來的

索引字段內容太大了

索引?我沒創建索引呢啊?而且表最大的字段長度才為255

解決方法:將mysql的engine更改為InnoDB就可以了

MySQL MyIsAm 存儲引擎在創建索引的時候,索引鍵長度是有一個較為嚴格的長度限制的,所有索引鍵最大長度總和不能超過1000,而且不是實際數據長度的總和,而是索引鍵字段定義長度的總和

1.DB engine 是MyIsAm
2.字符集是 utf8 ,1個utf8=3bytes
3.最后就是 (100+255)*3>1000 所以報錯
 
解決方案很多 ,修改DB engine 至 innodb,或者是更改字符集,或者是減小字段長度 皆可.


免責聲明!

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



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