必须同时配置mysql服务端、数据库、表、字段及laravel连接层为utf8mb4,缺一不可;仅改某一层会导致中文或emoji乱码或报错incorrect string value。

要让Laravel项目正确存储中文、emoji等多字节字符,必须同时确保MySQL数据库字符集为utf8mb4、Laravel配置指向该编码,并验证Composer依赖中数据库驱动和框架版本是否支持该设置——仅改配置文件或仅调表结构都不足以生效。
检查MySQL实际字符集与排序规则
登录数据库执行:SHOW VARIABLES LIKE 'character_set%'; 和 SHOW VARIABLES LIKE 'collation%';。重点关注 【character_set_server】 和 【collation_server】 是否为 utf8mb4 与 utf8mb4_unicode_ci;若不是,后续Laravel配置再对也无效。
运行 SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'your_database_name'; 确认当前库默认字符集。如果返回的是 utf8(非 utf8mb4),说明建库时未指定,需重建或 ALTER DATABASE。
检查已有表:执行 SHOW CREATE TABLE users;(替换为任意业务表名),观察 DEFAULT CHARSET= 后是否为 utf8mb4。若为 utf8,即使数据库级设对了,单表仍可能存不下 emoji。
验证Laravel配置是否启用utf8mb4支持
打开 config/database.php,定位到 'mysql' 连接配置块,在 'charset' 键值设为 'utf8mb4','collation' 设为 'utf8mb4_unicode_ci'。
确认 'prefix' 后没有多余逗号导致PHP解析失败——这种语法错误会让整个配置文件加载失败,但错误日志常被静默吞掉,表现为“查不到表”或“连接成功但数据乱码”。
若使用环境变量管理配置,请检查 .env 中的 DB_CHARSET=utf8mb4 和 DB_COLLATION=utf8mb4_unicode_ci 是否存在且未被注释;Laravel 10+ 默认不再从 .env 自动注入 charset/collation,必须在 database.php 中显式绑定变量,例如:'charset' => env('DB_CHARSET', 'utf8mb4')。
检查Composer依赖是否兼容utf8mb4
第一步:运行 composer show doctrine/dbal -i → 查看 Doctrine DBAL 实际安装版本。Laravel 9.0+ 强依赖 DBAL v3.x,而 v2.x 对 utf8mb4 的索引长度限制处理不完善,可能导致迁移失败或字段截断。
第二步:运行 composer show laravel/framework -i → 确认框架版本不低于 8.75.0(首次完整支持 utf8mb4 默认迁移)或 9.0(强制要求 DBAL v3)。低于此版本的 Laravel 在生成 Schema::create() 迁移时,默认仍用 utf8 建表,即使配置写了 utf8mb4。
第三步:运行 composer outdated --direct → 检查 doctrine/dbal 和 laravel/framework 是否有可升级版本。若输出中这两项标红,说明当前安装版本已过时,可能缺失 utf8mb4 元数据识别能力。
注意:不要直接跑 composer update 全局升级——它可能把 doctrine/dbal 升到 v4(Laravel 11 才原生支持),导致当前 Laravel 版本无法启动。应锁定范围:composer update doctrine/dbal laravel/framework --with-dependencies。
验证迁移文件是否生成utf8mb4语句
执行 php artisan migrate:status → 确保所有迁移已执行。未执行的迁移不会触发字符集检查。
新建一个测试迁移:php artisan make:migration create_test_utf8mb4_table,在 up() 方法中写入:Schema::create('test_utf8mb4', function (Blueprint $table) { $table->id(); $table->string('content'); $table->timestamps(); });。
运行 php artisan migrate --pretend → 观察输出 SQL。若看到 ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci,说明配置链路通畅;若仍是 DEFAULT CHARSET=utf8,问题一定出在 DBAL 版本或 Laravel 框架补丁缺失。
这一步不能跳过。很多开发者改完配置就以为万事大吉,结果新表还是 utf8,只因迁移生成器没真正启用 utf8mb4 支持。











