Laravel 5.4 MySQL 数据库字符编码变更引起的字符串长度问题

在新安装的 laravel 5.4 中,配置好 mysql 连接并执行 php artisan migrate 命令时,会出现:

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

提示索引键名太长,原因是5.4版本的 Laravel 将 mysql 默认字符编码换成了utf8mb4 ,见config/database.php

        'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],

utf8 的 varchar 类型字符串最长255,换成utf8mb4最长是191,然而框架里面默认长度还是用的 255 导致长度不够了,暂时解决方法是在 app/Providers/AppServiceProvider.php 添加字符默认长度:

 use Illuminate\Support\Facades\Schema;

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

参见:https://laravel-news.com/laravel-5-4-key-t...

本帖已被设为精华帖!
本帖由 Summer 于 7年前 加精
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 8
萧晔离

学习了

7年前 评论

有遇到这个问题,还有一种解决方案是升级数据库的版本

7年前 评论
leo

$table->string('phone')->charset('utf8')->collate('utf8_general_ci')

7年前 评论

修改 config/database.php 里的 charset,collation,engine 。

         'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'databasename'),
            'username' => env('DB_USERNAME', 'dbuser'),
            'password' => env('DB_PASSWORD', 'dbpassword'),
            'charset' => 'utf8',
            'collation' => 'utf8_general_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => 'MYISAM',
        ],

歹势,我挂了个倒档。

7年前 评论

我比较倾向于楼主的解决方式而不是把编码修改回utf8,毕竟咱要向前看呀😂,但问题是,既然5.4以后的版本变更了默认字符编码,那是不是也应该同步更新框架里默认的字符长度呢?没想明白为啥还需要手动搞这一步。。。

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!