django.db.utils.OperationalError: (1071, 'Specified key was too long; max key length is 767 bytes');
在使用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');