首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL「Specified key was too long」錯誤深度解析與解決方案

     編輯:MySQL 資料庫相關知識

錯誤成因:索引鍵長度超過引擎限制

MySQL 報錯 Specified key was too long; max key length is 1000 bytes,本質是聯合索引的所有列長度之和(按字符集換算為字節)超過了存儲引擎的限制。InnoDB(MySQL 5.5+ 默認)單索引最大長度為 767 字節(或 3072 字節,視 innodb_large_prefix 設置),MyISAM 為 1000 字節。

字符集與字節換算規則

字符集每字符字節數
latin11 byte
gbk2 bytes
utf8 / utf8mb33 bytes
utf8mb44 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 定義為足夠而非最大長度。
  • 使用前綴索引: 僅索引前 N 個字符,如 INDEX idx_name (col_name(50))。
  • 升級引擎版本/參數: MySQL 5.7+ / InnoDB 啟用 innodb_large_prefix=ON 且 ROW_FORMAT=DYNAMIC/COMPRESSED 可將限制提升至 3072 字節。
  • 改用哈希索引/全文索引: 對於長文本,考慮 MD5/SHA1 哈希值建索引,或全文索引。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved