問題

當我執行以下命令時:

 ALTER TABLE `mytable` ADD UNIQUE (
`column1` ,
`column2`
);
 

我收到此錯誤訊息:

 #1071 - Specified key was too long; max key length is 767 bytes
 

關於column1和column2的資訊:

 column1 varchar(20) utf8_general_ci
column2  varchar(500) utf8_general_ci
 

我認為varchar(20)只需要21個位元組,而varchar(500)只需要501個位元組.所以總位元組是522,小於767.那麼為什麼我收到錯誤訊息?

 #1071 - Specified key was too long; max key length is 767 bytes
 

  最佳答案

767位元組是MySQL版本5.6(和之前版本)中InnoDB表的表示的字首限制.MyISAM表的長度為1,000位元組.在MySQL版本5.7中,上限已增加到3072位元組.

您還必須知道,如果您在編碼為utf8mb4的大char或varchar欄位上設定索引,則必須將最大索引字首長度(767位元組或3072位元組)除以4,結果為191.這是因為utf8mb4字元的最大長度是四個位元組.對於utf8字元,它將是三個位元組,導致最大索引字首長度為254.

您可以選擇的一個選項是將下限放在您的 VARCHAR 欄位上。

另一個選項(根據對此問題的響應)是獲取列的子集而不是整個數量,即:

 ALTER TABLE `mytable` ADD UNIQUE ( column1(15), column2(200) );
 

儘管您需要獲得關鍵應用,但我想知道是否值得審查您關於這個實體的資料模型,以檢視是否有改進,允許您實現預期的業務規則而不觸及MySQL限制.

  相同標籤的其他問題

mysqlbytevarcharmysql-error-1071