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;

 

使用python的依賴:django-guardian(作用是實現精細的權限控制),也發生了錯誤:Specified key was too long,max key length is 767 bytes,原因是這個插件需要創建數據表,而表里有索引,而使用所有的字段長度為255,超過了限制:

 

 

 

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM