MySQL:Specified key was too long; max key length is 767 bytes

從此醉發表於2013-11-19

下面的SQL語句

CREATE TABLE subscription (
subscriptionid varchar(767) NOT NULL PRIMARY KEY,
params blob,
dest varchar(1023),
sched blob,
trigg varchar(1023),
initialrecordingtime timestamp,
exportifempty boolean,
queryname varchar(1023),
lastexecuted timestamp
);


即便是改為

CREATE TABLE subscription (
subscriptionid varchar(767) NOT NULL PRIMARY KEY,
params blob,
dest varchar(767),
sched blob,
trigg varchar(767),
initialrecordingtime timestamp,
exportifempty boolean,
queryname varchar(767),
lastexecuted timestamp
);

依然是這個錯誤!!

將mysql資料庫指令碼中的unique index欄位從原來的varchar(256)改成varchar(1024),再次執行報錯:

ERROR 1071 (42000) at line 482 in file: 'db/sm1.sql': Specified key was too long; max key length is 767 bytes

以前寫過一篇文章,也是關於這個問題的


在該文中,我經過試驗,發現如果將varchar型別的unique index/key設定成最大383,就不會出現問題了。

其實這個問題還有一個解,那就是指定索引的長度:

對於CHAR和VARCHAR列,只用一列的一部分就可建立索引。建立索引時,使用col_name(length)語法,對字首編制索引。字首包括每列值的前length個字元。BLOB和TEXT列也可以編制索引,但是必須給出字首長度。

那麼在不改變欄位長度的情況下,通過指定索引長度為一個較小的值,就可以避免出現這個問題了。

    UNIQUE INDEX        (content(32)),

又如,

此處展示的語句用於建立一個索引,索引使用列名稱的前10個字元。

CREATE INDEX part_of_name ON customer (name(10));
因為多數名稱的前10個字元通常不同,所以此索引不會比使用列的全名建立的索引速度慢很多。


相關文章