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);
}
本帖已被设为精华帖!
本帖由 Summer
于 8年前 加精
学习了
有遇到这个问题,还有一种解决方案是升级数据库的版本
$table->string('phone')->charset('utf8')->collate('utf8_general_ci')
http://stackoverflow.com/questions/2378635...
学习了
学习了
修改 config/database.php 里的 charset,collation,engine 。
歹势,我挂了个倒档。
我比较倾向于楼主的解决方式而不是把编码修改回utf8,毕竟咱要向前看呀😂,但问题是,既然5.4以后的版本变更了默认字符编码,那是不是也应该同步更新框架里默认的字符长度呢?没想明白为啥还需要手动搞这一步。。。