1. 程式人生 > >django.db.utils.OperationalError: (1071, 'Specified key was too long; max key length is 767 bytes');

django.db.utils.OperationalError: (1071, 'Specified key was too long; max key length is 767 bytes');

ali iss xxxxx beat 字符串類型 參數設置 5.6 detail spa

在使用utf8mb4字符集的情況下,如果列存在索引,那麽varchar的最大長度是191

技術分享圖片數據庫版本:技術分享圖片技術分享圖片

在使用utf8字符集的情況下,如果列存在索引,那麽varchar的最大長度是255。

技術分享圖片

在大字段上創建索引時,有時會碰到下面的錯誤

ERROR 1709 (HY000): Index column size too large. The maximum column size is 767 bytes.

技術分享圖片

1. 錯誤原因

由於 MySQL Innodb 引擎表索引字段長度的限制為 767 字節,因此對於多字節字符集的大字段(或者多字段組合索引),創建索引會出現上面的錯誤。

以 utf8mb4 字符集 字符串類型字段為例:utf8mb4 是 4 字節字符集,則默認支持的索引字段最大長度是: 767 字節 / 4 字節每字符 = 191 字符,因此在 varchar(255) 或 char(255) 類型字段上創建索引會失敗。

註:MySQL官網關於 utf8mb4 字符集的參考文檔

2. 解決步驟

Step 1. RDS 控制臺 技術分享圖片 參數設置,調整參數 innodb_large_prefix 為 ON

將 Innodb_large_prefix 修改為 on 後,對於 Dynamic 和 Compressed 格式的InnoDB 引擎表,其最大的索引字段長度支持到 3072 字節。

技術分享圖片

Step 2. 創建表的時候指定表的 row format 格式為 Dynamic 或者 Compressed,如下示例:

create table idx_length_test_02
(
  id int auto_increment primary key,
  name varchar(255)
) 
ROW_FORMAT=DYNAMIC default charset utf8mb4;

技術分享圖片

 insert into idx_length_test_02 values (null,‘xxxxxxxxxx‘);

技術分享圖片

 create index idx_name on idx_length_test_02 (name);

技術分享圖片

show warnings;
show create table idx_length_test_02 \G

技術分享圖片

Step 3. 修改現有表

對已經創建的表,通過下面的語句修改下表的 row_format 格式

alter table <table_name> row_format=dynamic;
alter table <table_name> row_format=compressed;

參考:https://github.com/celery/django-celery-beat/issues/18

這篇文章https://help.aliyun.com/knowledge_detail/41707.html描述的比較清楚

django.db.utils.OperationalError: (1071, 'Specified key was too long; max key length is 767 bytes');