必须在config/database.php的mysql连接块中同时配置charset、collation和pdo初始化命令,缺一不可;仅改.env或服务端设置无效,且db_charset环境变量不被laravel读取。

要让 Laravel 项目真正支持中文、emoji 和生僻字,必须在 config/database.php 中精准配置 MySQL 连接层字符集,仅改 .env 或数据库服务端设置都不够——【charset 和 collation 必须同时设为 utf8mb4 系列,且 PDO 初始化命令不可省略】。
确认 config/database.php 的 mysql 配置块位置
打开项目根目录下的 config/database.php 文件,找到 'connections' 数组中键名为 'mysql' 的子数组。这个数组控制 Laravel 所有通过 DB facade 或 Eloquent 发起的 MySQL 连接行为。
不要修改 'sqlite'、'pgsql' 或其他驱动配置——它们与 MySQL 字符集无关。
添加 charset、collation 和 PDO 初始化命令
在 'mysql' 配置块内,确保包含以下三项(顺序不限,但缺一不可):
① 'charset' => 'utf8mb4'
② 'collation' => 'utf8mb4_unicode_ci'
③ 'options' => [PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci"]
这三行必须全部存在。只加 charset 和 collation,Laravel 8+ 在某些 PDO 版本下仍会走默认 utf8 连接;漏掉 options,迁移和 Artisan 命令将无法生效。
注意:不要写成 'charset' => env('DB_CHARSET', 'utf8mb4')——【.env 中的 DB_CHARSET 变量 Laravel 官方代码根本不读取,纯属误导】。
验证配置是否被实际加载
运行 php artisan tinker,然后执行:
DB::connection()->getPdo()->getAttribute(PDO::ATTR_CLIENT_VERSION)
再执行:
DB::select("SHOW VARIABLES LIKE 'character_set_client'")[0]->Value
返回值必须是 utf8mb4。如果不是,说明配置未生效——常见原因是 config:clear 缓存未刷新,或 config/database.php 被错误地放在了 vendor 目录下。
已有迁移表如何补救
方法一:手动升级单张表
php artisan db:table users --alter="CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"
方法二:生成新迁移强制重设表级字符集
php artisan make:migration fix_charset_for_users_table
在 up() 方法中写入:
DB::statement("ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
这一步不能用 Schema::table(...)->charset(...) —— Laravel 不提供该链式方法,强行调用会报错。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











