laravel执行php artisan migrate因mys
2018-12-26 本文已影响11人
DragonersLi
本地数据库mysql版本:5.5.53
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);
image.png
找到项目根目录下的config/database.php下的mysql
'engine' => 'InnoDB ROW_FORMAT=DYNAMIC',#SQLSTATE[42000]
image.png
清空数据库,重新执行 php artisan migrate
就可以看到Migration table created successfully.了
image.png