MySQL 報錯 Specified key was too long; max key length is 1000 bytes,本質是聯合索引的所有列長度之和(按字符集換算為字節)超過了存儲引擎的限制。InnoDB(MySQL 5.5+ 默認)單索引最大長度為 767 字節(或 3072 字節,視 innodb_large_prefix 設置),MyISAM 為 1000 字節。
| 字符集 | 每字符字節數 |
|---|---|
| latin1 | 1 byte |
| gbk | 2 bytes |
| utf8 / utf8mb3 | 3 bytes |
| utf8mb4 | 4 bytes |
假設表使用 GBK,建立聯合唯一索引:
CREATE UNIQUE INDEX `unique_record` ON reports (`report_name`, `report_client`, `report_city`);
-- 三列均為 VARCHAR(200)
-- 計算:(200 + 200 + 200) * 2 = 1200 bytes > 1000 bytes(MyISAM 限制) -> 報錯
解決:將 report_city 改為 VARCHAR(100),總長度變為 (200+200+100)*2 = 1000,恰好達標。
若表為 UTF8,同樣結構:(200+200+200)*3 = 1800 > 1000,必須大幅縮減列長度或減少索引列數。
VARCHAR 定義為足夠而非最大長度。INDEX idx_name (col_name(50))。innodb_large_prefix=ON 且 ROW_FORMAT=DYNAMIC/COMPRESSED 可將限制提升至 3072 字節。MD5/SHA1 哈希值建索引,或全文索引。