laravel migrate时报错:Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes
今天在学习laravel的路由模型绑定时,在按照文档执行php artisan migrate
时报错。
in connection.php line 664: sqlstate[42000]: syntax error or access violation: 1071 specified key was too long; max key length is 767 bytes (sql: alter table `users` add unique `users_email_unique`(`email`) ) in connection.php line 458: sqlstate[42000]: syntax error or access violation: 1071 specified key was too long; max key length is 767 bytes
原来,laravel 5.4+默认使用utf8mb4字符编码,而不是之前的utf8编码。因此在运行php artisan migrate 会报出错误。
问题根源
mysql支持的utf8编码最大字符长度为3字节,如果遇到4字节的宽字符就会出现插入异常。三个字节utf-8最大能编码的unicode字符是0xffff,即unicode中的基本多文种平面(bmp)。因而包括emoji表情(emoji是一种特殊的unicode编码)在内的非基本多文种平面的unicode字符都无法使用mysql的utf8字符集存储。
这也应该就是laravel 5.4+改用4字节长度的utf8mb4字符编码的原因之一。不过要注意的是,只有mysql 5.5.3版本以后才开始支持utf8mb4字符编码(查看版本:selection version();)。如果mysql版本过低,需要进行版本更新。
laravel同样也可以手动配置迁移生成的默认字符串长度:
如果你正在运行的 mysql release 版本低于5.7.7 或 mariadb release 版本低于10.2.2 ,为了mysql为它们创建索引,你可能需要手动配置迁移生成的默认字符串长度,你可以通过调用 appserviceprovider 中的 schema::defaultstringlength 方法来配置它,或者你可以为数据库开启 innodb_large_prefix 选项,有关如何正确开启此选项的说明请查阅数据库文档。
解决办法
1.mysql版本升级至5.5.3以上
2.手动配置迁移命令migrate生成的默认字符串长度,在appserviceprovider中调用schema::defaultstringlength方法来实现配置(如果mysql版本大于5.7.7就无需配置了):
namespace app\providers; use illuminate\support\serviceprovider; use illuminate\support\facades\schema; class appserviceprovider extends serviceprovider { /** * bootstrap any application services. * * @return void */ public function boot() { schema::defaultstringlength(191); } }
原文链接: laravel migrate时报错: syntax error or access violation: 1071 specified key was too long