必须将mysql连接层字符集显式设为utf8mb4,包括laravel配置中的charset、collation及pdo初始化命令,并同步配置mysql服务端、表结构、迁移文件、php环境及redis等周边组件,否则emoji和生僻字会乱码或报错。

你的Laravel项目刚上线,用户提交的中文在数据库里存成了“???”,页面显示一堆问号,迁移、插入、查询全乱套——这不是数据丢了,是字符集在连接层就断掉了。
确认当前连接字符集是否为utf8mb4
进入MySQL命令行,执行:SHOW VARIABLES LIKE 'character_set_client';
如果返回值不是 【utf8mb4】,说明Laravel发出去的SQL请求根本没用utf8mb4编码,后续所有修复都白搭。
别急着改配置,先验证这一步:用php artisan tinker运行DB::connection()->getPdo()->getAttribute(PDO::ATTR_CONNECTION_STATUS),输出里必须含charset=utf8mb4,否则配置没生效。
强制Laravel连接层使用utf8mb4
打开config/database.php,定位到'mysql'配置块,在其中添加或修改三项:
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'options' => [PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci"]
【删掉.env里DB_CHARSET=utf8mb4这一行】——Laravel官方源码根本不读这个变量,留着只会误导你。
改完立刻清缓存:php artisan config:clear,否则新配置不会加载。
升级已有表和字段编码
仅改Laravel配置不能修复旧数据。执行以下SQL(替换your_database为实际库名):
ALTER DATABASE your_database CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
然后逐个升级表:
第一步:生成所有表的转换语句SELECT CONCAT('ALTER TABLE `', table_name, '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;') FROM information_schema.tables WHERE table_schema = 'your_database';
第二步:复制结果,粘贴进MySQL执行
注意:大表执行时会锁表,避开高峰期操作。
第三步:检查字段级编码是否同步更新SHOW CREATE TABLE users;,确认每个VARCHAR字段后都带CHARACTER SET utf8mb4,否则要单独改字段:ALTER TABLE users MODIFY name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
验证中文注释能否存住
方法一:新建迁移文件,写入带中文注释的字段
$table->string('nickname')->comment('用户昵称(支持emoji)')->nullable();
方法二:直接执行SQL验证
SELECT COLUMN_NAME, COLUMN_COMMENT FROM information_schema.COLUMNS WHERE TABLE_NAME = 'users' AND TABLE_SCHEMA = 'your_database';
如果COLUMN_COMMENT列显示为空或乱码,说明MySQL服务端未启用utf8mb4支持——立刻去检查my.cnf或my.ini中[mysqld]段是否包含character-set-server = utf8mb4并已重启MySQL服务。
Windows下PHP进程编码补救
如果你用PHPStudy、XAMPP或WAMP,即使Laravel和MySQL都配对了,仍可能显示问号。
找到PHP安装目录下的php.ini,搜索default_charset,设为:
default_charset = "UTF-8"
然后【必须重启Apache或Nginx服务,不是重启命令行窗口】——很多开发者卡在这一步,改完配置却没重启Web服务进程。
最后测试:在控制器中写return response()->json(['msg' => '你好世界']);,用curl或Postman访问,响应体里中文必须原样出现,不能是\u4f60\u597d或方块。











