欢迎光临
我们一直在努力

Laravel5.5的数据库迁移操作报错问题解决

1、Laravel5的数据迁移报错解决

执行迁移文件: php artisan migrate ; 数据库中就会看到我们新添加的字段;
报错

[Illuminate\Database\QueryException]
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`))
[PDOException]
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes

这是由于Laravel默认使用utf8mb4字符,包括支持在数据库存储「 表情」。如果你正在运行的MySQL release版本低于5.7.7 或 MariaDB release
版本低于10.2.2,为了MySQL为它们创建索引,你可能需要手动配置迁移生成的默认字符串长度,你可以通过调用App\Provider\AppServiceProvider中的
Schema::defaultStringLength方法来配置它:

解决办法,在红框处加下下面的代码
———————

public function boot()
{
   //MySQL < 5.7 must setting defaultStringLength
   Schema::defaultStringLength(191);
}

再次执行迁移文件:php artisan migrate; 数据库中就会看到我们新添加的字段;
报错

[Symfony\Component\Debug\Exception\FatalThrowableError]
Class 'App\Providers\Schema' not found
--------------------- 

解决办法:在use Illuminate\Support\ServiceProvider;下面加入以下代码

use Illuminate\support\Facades\Schema;

再次执行迁移文件:php artisan migrate ;就可以成功创建表了。

2、Laravel5的php artisan migrate迁移数据错误分析

Laravel 5.4默认使用utf8mb4字符编码,而不是之前的utf8编码。因此运行php artisan migrate 会出现如下错误:

[Illuminate\Database\QueryException]
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))

[PDOException]
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes

问题根源
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字符编码(查看版本:select version();)。如果MySql版本过低,需要进行版本更新。

注:如果是从Laravel 5.3升级到Laravel 5.4,不需要对字符编码做切换。

解决问题
升级MySql版本到5.5.3以上。
手动配置迁移命令migrate生成的默认字符串长度,在AppServiceProvider中调用Schema::defaultStringLength方法来实现配置:

use Illuminate\Support\Facades\Schema;

    public function boot()
    {
       Schema::defaultStringLength(191);
    }

未经允许不得转载:发现未来 » Laravel5.5的数据库迁移操作报错问题解决

分享到:更多 ()

评论 抢沙发

评论前必须登录!

 

发现网服务 更专业 更方便

广告联系联系我们