一、錯誤提示Specified key was too long; max key length is 767 bytes; 二、原因分析在數(shù)據(jù)庫中,索引的字段設(shè)置太長了,導(dǎo)致不支持。【根本原因:5.6版本的innodb大長度前綴默認是關(guān)閉的】。 mysql建立索引時,數(shù)據(jù)庫計算key的長度是累加所有index用到的字段的char長度,在按照下面的比例乘起來 不能超過限定的key長度767: latin1 = 1 byte = 1 character uft8 = 3 byte = 1 character utf8mb4 = 4byte = 1character gbk = 2 byte = 1 character 做個實驗: CREATE TABLE `xxl_job_registry` (`id` int(11) NOT NULL AUTO_INCREMENT,`registry_group` varchar(50) NOT NULL,`registry_key` varchar(190) NOT NULL,`registry_value` varchar(250) NOT NULL,`update_time` datetime DEFAULT NULL,PRIMARY KEY (`id`),KEY `i_g_k_v` (`registry_key`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;registry_key 190 * 4 = 760因此創(chuàng)建成功若將registry_key的字節(jié)數(shù)改成192,則195 * 4 = 780 則創(chuàng)建不成功 注意網(wǎng)上說,如果是聯(lián)合索引的話,應(yīng)該是兩個索引的字節(jié)加起來,然后折算成字節(jié)數(shù)。例如: CREATE TABLE `xxl_job_registry` (`id` int(11) NOT NULL AUTO_INCREMENT,`registry_group` varchar(50) NOT NULL,`registry_key` varchar(190) NOT NULL,`registry_value` varchar(110) NOT NULL,`update_time` datetime DEFAULT NULL,PRIMARY KEY (`id`),KEY `i_g_k_v` (`registry_key`, `registry_value`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;那么索引需要的字節(jié)數(shù)是:(190 + 110) * 4 = 1200創(chuàng)建不成功但是實際上呢,是能創(chuàng)建成功。在創(chuàng)建索引的時候進行了優(yōu)化,取字節(jié)數(shù)最長的那個 190 * 4 = 760因此能創(chuàng)建成功。 三、解決方法1、第一種解決方法修改索引的varchar字符,只要讓字符 * 字節(jié)數(shù) < 767即可,所以網(wǎng)上推薦 縮小字符數(shù) 但是有時某個字段的字符數(shù)是一定要足夠大的,這時候用第二種方式。 2、第二種解決方法// 查看show variables like "innodb_large_prefix";show variables like "innodb_file_format";//修改最大索引長度限制set global innodb_large_prefix=1;或set global innodb_large_prefix=on;set global innodb_file_format=BARRACUDA; 修改插入sql的語句添加ROW_FORMAT=DYNAMIC; create table idx_length_test_02(id int auto_increment primary key,name varchar(255))ROW_FORMAT=DYNAMIC ENGINE=InnoDB default charset utf8mb4; |
|