必须将MySQL和Laravel全链路升级为utf8mb4字符集才能解决中文及emoji插入报错;需修改my.cnf配置、更新database.php连接参数,并通过迁移命令ALTER DATABASE统一设置字符集。

当Laravel应用部署到新服务器或迁移旧数据库时,中文插入报错“Incorrect string value”,根本原因是MySQL默认字符集为latin1或utf8(非utf8mb4),无法存储emoji和部分生僻汉字。必须将数据库、表、字段全部升级为utf8mb4才能彻底解决。
修改MySQL服务端配置
编辑MySQL主配置文件my.cnf(Linux通常在/etc/mysql/my.cnf,macOS用brew安装的在/usr/local/etc/my.cnf):
在[mysqld]段落下添加以下四行配置:
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
skip-character-set-client-handshake = true
【skip-character-set-client-handshake = true这一行必须加上】,否则客户端连接时仍可能沿用旧字符集,导致配置形同虚设。
保存后重启MySQL服务:systemctl restart mysql(或brew services restart mysql)。
重置Laravel数据库连接配置
打开config/database.php,找到mysql配置项下的charset和collation两项:
将'charset' => 'utf8'改为'charset' => 'utf8mb4';
将'collation' => 'utf8_unicode_ci'改为'collation' => 'utf8mb4_unicode_ci';
同时确保'prefix'后没有多余空格,否则迁移命令会因SQL语法错误中断。
一键执行字符集升级迁移
创建新迁移文件:php artisan make:migration update_charset_to_utf8mb4 --table=users
在up()方法中写入一行核心SQL语句:
DB::statement("ALTER DATABASE `".config('database.connections.mysql.database')."` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci");
接着运行迁移命令:
php artisan migrate
这行代码会直接修改当前数据库的默认字符集,后续新建的表自动继承utf8mb4,无需逐个ALTER TABLE。


















