在使用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 是MyIsAm2.字符集是 utf8 ,1個utf8=3bytes3.最后就是 (100+255)*3>1000 所以報錯解決方案很多 ,修改DB engine 至 innodb,或者是更改字符集,或者是減小字段長度 皆可.