laravel执行php artisan migrate因mysql版本问题报错解决笔记!

本地数据库mysql版本:5.5.53

laravel执行php artisan migrate因mysql版本问题报错解决笔记!_第1张图片
image.png
执行 php artisan migrate
因mysql版本问题引起的:Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes 问题解决:

报错如下:

 SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; 
max key length is 1000 bytes 
(SQL: alter table `users` add unique `users_user_name_unique`(`user_name`))

问题根源:

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就无需配置了):

找到项目根目录下的app/Providers/AppServiceProvider.php,顶部引入use Illuminate\Support\Facades\Schema;然后在boot()方法,加入

Schema::defaultStringLength(191);
laravel执行php artisan migrate因mysql版本问题报错解决笔记!_第2张图片
image.png

找到项目根目录下的config/database.php下的mysql

'engine' => 'InnoDB ROW_FORMAT=DYNAMIC',#SQLSTATE[42000]
laravel执行php artisan migrate因mysql版本问题报错解决笔记!_第3张图片
image.png

清空数据库,重新执行 php artisan migrate

就可以看到Migration table created successfully.了

laravel执行php artisan migrate因mysql版本问题报错解决笔记!_第4张图片
image.png

你可能感兴趣的:(laravel执行php artisan migrate因mysql版本问题报错解决笔记!)