当前位置:   article > 正文

laravel migrate时报错:Syntax error or access violation: 1071 Specified key was too long; max key length...

syntax error or access violation: 1071 specified key was too long; max key l

今天在学习laravel的路由模型绑定时,在按照文档执行php artisan migrate时报错。

  1. In Connection.php line 664:
  2. 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`) )
  3. In Connection.php line 458:
  4. 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就无需配置了):

  1. namespace App\Providers;
  2. use Illuminate\Support\ServiceProvider;
  3. use Illuminate\Support\Facades\Schema;
  4. class AppServiceProvider extends ServiceProvider
  5. {
  6. /**
  7. * Bootstrap any application services.
  8. *
  9. * @return void
  10. */
  11. public function boot()
  12. {
  13. Schema::defaultStringLength(191);
  14. }
  15. }

究其原因,还是MySQL版本太低了,如果是MySQL5.7.7及以上版本,就没有上面的问题啦,也不需要手动配置迁移命令migrate生成的默认字符串长度。
原文链接: Laravel migrate时报错: Syntax error or access violation: 1071 Specified key was too long

转载于:https://www.cnblogs.com/itbsl/p/10065927.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/599633
推荐阅读
相关标签
  

闽ICP备14008679号