新聞中心
MySQL在創(chuàng)建數(shù)據(jù)庫的時候,字符集設(shè)置的不是utf8而是utf9mb4,在導(dǎo)入sql腳本的時候,發(fā)現(xiàn)提示如下錯誤:
站在用戶的角度思考問題,與客戶深入溝通,找到惠東網(wǎng)站設(shè)計與惠東網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站設(shè)計、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、主機域名、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋惠東地區(qū)。
從上圖中,我們可以看出,使用的是innodb及字符集。錯誤提示是長度太長了:Specified key was too long; max key length is 767 bytes
來查看下創(chuàng)建表的語句:
CREATE TABLE `xxl_job_registry` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`registry_group` varchar(50) NOT NULL,
`registry_key` varchar(255) NOT NULL,
`registry_value` varchar(255) NOT NULL,
`update_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `i_g_k_v` (`registry_group`,`registry_key`,`registry_value`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
varchar的長度明明設(shè)置的是255啊。怎么會報出767 bytes的錯誤呢?
我們在看看錯誤提示:
[Err] 1071 - Specified key was too long; max key length is 767 bytes。
這個就是因為聯(lián)合所以長度限制的。
我們來看看MySql InnoDB引擎對索引長度的限制:
mysql單索引限制:
在默認情況下,InnoDB對單一的字段索引長度限制最大為767個字節(jié)。
這個長度怎么來的呢 ?當(dāng)mysql創(chuàng)建數(shù)據(jù)庫的時候,字符集使用的是UTF-8的時候,我們知道UTF-8每個字符使用三個字節(jié)來存儲的。即:256*3-1=767了。這個767字符大小的限制就是從這里來的。
聯(lián)合索引(前綴索引)限制:
同樣的,mysql對前綴索引也有同樣的限制。根據(jù)字符集不同,長度限制也不同。
字符集使用utf8的時候長度限制是:767個
使用uft8mb4的時候長度限制是:3072個
但是,在文章一開始,凱哥就強調(diào)了,凱哥數(shù)據(jù)庫使用的字符集是:utf8mb4。我們也知道,utf8mb4編碼的每個字符使用四個字節(jié)來存儲的。我們來計算下:256*4-1>767。
從凱哥的sql腳本可以看出:KEY `i_g_k_v` (`registry_group`,`registry_key`,`registry_value`) 使用到了聯(lián)合索引(前綴索引)。
隨意凱哥數(shù)據(jù)庫的字符集使用的不是utf8,但是mysql系統(tǒng)變量innodb_large_prefix未開啟(因為凱哥使用的是默認配置)。如果系統(tǒng)變量innodb_large_prefix開啟了,就會對使用dynamic或者是comperssed行格式的InnoD表,索引鍵長度限制為3072個字節(jié)了。如果沒有開啟這個,InnoDB會對,無論什么表索引鍵長度限制都是767了。
解決方案有兩種:
1:mysql系統(tǒng)變量innodb_large_prefix開啟。
需要修改配置,重啟mysql服務(wù)等等。。。太麻煩了。凱哥這里使用了第二種方案
2:修改聯(lián)合主鍵中每個字段的長度
聯(lián)合主鍵的三個字段如下:
`registry_group` varchar(50) NOT NULL,
`registry_key` varchar(255) NOT NULL,
`registry_value` varchar(255) NOT NULL,
將varchar(255)的修改為varchar(100)后(注:這里的長度根據(jù)自己需求進行設(shè)置。如果非要用255個字符以上,請選擇使用第一種解決方案),sql腳本就執(zhí)行成功。如下圖:
延伸知識點:
當(dāng)遇到如下錯誤:
錯誤信息是3072的時候,說明開啟了系統(tǒng)變量,但是還是超長了。這個時候,可以采用同樣的方案來處理。
網(wǎng)站標(biāo)題:mysql提示字符長度超限制的解決方法
URL網(wǎng)址:http://www.dlmjj.cn/article/jedgoj.html