欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-19 13:52:41
今天在学习laravel的路由模型绑定时,在按照文档执行 时报错。 php In Connection.php line 664: SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; ......

今天在学习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