在使用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描述的比較清楚