美文网首页
laravel执行php artisan migrate因mys

laravel执行php artisan migrate因mys

作者: DragonersLi | 来源:发表于2018-12-26 14:54 被阅读11次

    本地数据库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

    相关文章

      网友评论

          本文标题:laravel执行php artisan migrate因mys

          本文链接:https://www.haomeiwen.com/subject/fxyhlqtx.html