今天在本地創(chuàng)建了一個mysql數(shù)據(jù)庫,然后運行了sql,報錯了,在服務(wù)器的mysql上執(zhí)行是沒問題的,錯誤信息是:
1071 Specified key was too long; max key length is 767 bytes
然后就想到了,服務(wù)器上是5.7的,

而我本地的mysql版本是5.6的,就是版本導(dǎo)致的問題,那么為什么一般都不會出現(xiàn)問題,今天反而出現(xiàn)了呢?

查找發(fā)現(xiàn)就是這個primary key部分報錯的。錯誤信息的意思是,設(shè)置的鍵長超過了767 bytes。在mysql 5.5.3之前,mysql的InnoDB引擎,要求設(shè)置的主鍵長度不得超過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? //當(dāng)該用gbk作為字符集的時候
(255+10+10)*4 = 1100? //當(dāng)用utf8m4作為字符集的時候,也超標(biāo)了
找到問題了自然就有解決方法了:
1、修改字符長度
//根據(jù)上面的分析可以進(jìn)行計算,我的主鍵長度不能超過192
768/4 = 192? ? ? ? ? ? // 但這樣很明顯是不符合的需求的,不能隨便改動數(shù)據(jù)庫的字段!
2、設(shè)置數(shù)據(jù)庫屬性 由utf8mb4轉(zhuǎn)為utf8 。
?這兩個區(qū)別是 utf8mb4多了emoji編碼支持,而utf8不支持,如果你想要支持emoji,那么就不能這樣操作。
3、升級mysql
服務(wù)器數(shù)據(jù)庫采用的是mysql5.7版本。升級數(shù)據(jù)庫問題就會解決。