key_to_long.png
Laravel 5.4更改了默認(rèn)數(shù)據(jù)庫字符集牡借,更改后默認(rèn)使用的utf8mb4包括支持存儲emojis腕铸。這只會影響新的應(yīng)用程序实辑,只要你運行的MySQL版本低于v5.7.7或者MariaDB低于10.2.2不从,就會碰到上述錯誤浊洞,那么我們?nèi)绾谓鉀Q呢牵敷?
laravel 5.4官方文檔在數(shù)據(jù)庫遷移(migrate)中給出了解決方法:
編輯app/Providers/AppServiceProvider.php文件,并在boot方法中設(shè)置一個默認(rèn)的字符串長度即可
:
key_to_long解決辦法
實際上這個問題我們可以看看原理法希,以前的MySQL使用UTF8時候一個編碼字符等于3個字節(jié)枷餐,那么varchar(255)字段的最大存儲字節(jié)就是255*3=765。InnoDB給出的限制是767b苫亦,那么MySQL 5.7之前varchar這個類型就是可以正常使用的毛肋。
但現(xiàn)在默認(rèn)的utf8mb4編碼中一個編碼字符為4個字節(jié)怨咪,那么最大的varchar類型的最大字節(jié)數(shù)就是2554=1020b,這已經(jīng)遠(yuǎn)遠(yuǎn)超過了InnoDB給出現(xiàn)限制767b润匙。由于1914=764<767诗眨,所以我們引入Schema類,通過boot方法調(diào)用了Schema的靜態(tài)方法
defaultStringLength
設(shè)置所有varchar類型的字段的字符數(shù)默認(rèn)(也是最大)為191孕讳。
實際上我在PhpStudy環(huán)境中只通過配置文件設(shè)置了MySQL默認(rèn)數(shù)據(jù)庫引擎為InnoDB就達(dá)到這一效果匠楚,這是因為我在低于MySQL5.7環(huán)境下新建voyager數(shù)據(jù)庫時選擇了utf8編碼。
新建數(shù)據(jù)庫時的字符集
MySQL默認(rèn)字符集問題
當(dāng)然厂财,無論是開發(fā)還是線上環(huán)境芋簿,還是推薦使用官方提供的homestead環(huán)境,內(nèi)置的PHP和數(shù)據(jù)庫均為配套的最新版本蟀苛,還有一大堆集成的可用工具益咬。如果你使用Docker集成,也可以使用bug挺多尚不完美的LaraDock帜平,開源地址:https://github.com/laradock/laradock幽告。