今天在本地創(chuàng)建了一個mysql數(shù)據(jù)庫贺氓,然后運行了sql蹲缠,報錯了仗扬,在服務器的mysql上執(zhí)行是沒問題的斋射,錯誤信息是:
1071 Specified key was too long; max key length is 767 bytes
然后就想到了育勺,服務器上是5.7的,
而我本地的mysql版本是5.6的罗岖,就是版本導致的問題涧至,那么為什么一般都不會出現(xiàn)問題,今天反而出現(xiàn)了呢桑包?
查找發(fā)現(xiàn)就是這個primary key部分報錯的南蓬。錯誤信息的意思是,設置的鍵長超過了767 bytes捡多。在mysql 5.5.3之前蓖康,mysql的InnoDB引擎,要求設置的主鍵長度不得超過767bytes垒手。mysql的MyIsam引擎的主鍵長度不得超過1000 bytes。
在mysql中倒信,gbk字符集會占用2個字節(jié)科贬。utf8字符會占用3個字節(jié),而且從mysql5.5.3之后的版本鳖悠,mysql 開始支持utf8m4字符榜掌,代表著一個字符占用4個字節(jié)。也就是說:
(255+10+10)*3 = 825? //在用utf8作為字符集的時候乘综,超過了規(guī)定的767 bytes
(255+10+10)*2 = 550? //當該用gbk作為字符集的時候
(255+10+10)*4 = 1100? //當用utf8m4作為字符集的時候憎账,也超標了
找到問題了自然就有解決方法了:
1、修改字符長度
//根據(jù)上面的分析可以進行計算卡辰,我的主鍵長度不能超過192
768/4 = 192? ? ? ? ? ? // 但這樣很明顯是不符合的需求的胞皱,不能隨便改動數(shù)據(jù)庫的字段!
2九妈、設置數(shù)據(jù)庫屬性 由utf8mb4轉為utf8 反砌。
?這兩個區(qū)別是 utf8mb4多了emoji編碼支持,而utf8不支持萌朱,如果你想要支持emoji宴树,那么就不能這樣操作。
3晶疼、升級mysql
服務器數(shù)據(jù)庫采用的是mysql5.7版本酒贬。升級數(shù)據(jù)庫問題就會解決又憨。