上线前必须确认laravel应用全程使用utf-8字符集,否则中文乱码、emoji存储失败、数据库插入截断等问题会在生产环境突然爆发;需检查php default_charset、mysql连接层(character_set_client/connection/results全为utf8mb4)、laravel配置中mysql的charset/collation设为utf8mb4、迁移与表结构已转utf8mb4、http响应头及blade模板含utf-8声明。

上线前必须确认Laravel应用全程使用UTF-8字符集,否则中文乱码、emoji存储失败、数据库插入截断等问题会在生产环境突然爆发,且难以复现排查。
检查PHP运行时默认字符集
打开终端,执行 php -i | grep default_charset,确认输出为 default_charset => UTF-8。
若显示为空或为 iso-8859-1,需编辑 php.ini 文件,找到 default_charset 行,将其值设为 "UTF-8";没有该行则手动添加一行:default_charset = "UTF-8"。
修改后必须重启PHP-FPM或Apache,否则配置不生效。Nginx + PHP-FPM环境下,执行 sudo systemctl restart php*-fpm(星号匹配你的PHP版本,如 php8.2-fpm)。
验证MySQL连接层字符集
方法一:在Laravel项目根目录运行 php artisan tinker,输入以下命令:
DB::select("SHOW VARIABLES LIKE 'character_set%';")
重点核对三行结果:character_set_client、character_set_connection、character_set_results 全部为 【utf8mb4】;若出现 utf8(无mb4),说明未启用完整Unicode支持,emoji会丢失或报错。
方法二:直接登录MySQL服务器,执行 mysql -u root -p -e "SHOW VARIABLES LIKE 'collation%';",确认 collation_server 和 collation_database 均为 utf8mb4_unicode_ci 或 utf8mb4_0900_ai_ci。
校验Laravel数据库配置
打开 config/database.php,定位到 mysql 连接配置块,在 'charset' 项明确写死为 'utf8mb4',同时设置 'collation' 为 'utf8mb4_unicode_ci'。
⚠️ 注意:不要依赖.env中仅配置 DB_CHARSET=utf8mb4 就以为万事大吉——Laravel 9+ 默认已将 charset 设为 utf8mb4,但旧项目或自定义配置可能仍为 utf8,必须人工核对代码中的实际值。
确保 'prefix' => '' 或其他字段不含BOM或不可见控制字符,这类字符会导致PDO连接初始化失败且报错模糊。
确认迁移文件与现有表结构
第一步:检查所有已执行的迁移文件,确认建表语句中包含 ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci 或等效声明。
第二步:对线上数据库逐表执行 SHOW CREATE TABLE table_name;,比对 DEFAULT CHARSET 和 COLLATE 是否均为 utf8mb4 系列;如有表仍为 utf8 或无声明,立即执行 ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;。
第三步:检查所有TEXT、VARCHAR字段长度——utf8mb4 下每个字符最多占4字节,原设为 VARCHAR(255) 的字段在InnoDB中可能超出65535字节限制,需酌情降至 VARCHAR(191) 并同步更新迁移文件和模型 $fillable / $casts 定义。
验证HTTP响应头与视图渲染
启动本地开发服务,用浏览器访问任意页面,打开开发者工具 → Network → 点击请求 → 查看 Response Headers 中是否包含 Content-Type: text/html; charset=UTF-8。
若缺失或为 charset=ISO-8859-1,检查 app/Http/Middleware/TrustProxies.php 是否误删了 header('Content-Type', 'text/html; charset=UTF-8'); 类似逻辑;更常见的是在 Blade 模板顶部遗漏 <meta charset="UTF-8">,必须补上。
确保所有 JSON 接口返回头含 Content-Type: application/json; charset=UTF-8,这由 Laravel 自动处理,但若使用了自定义响应构造(如 response()->json(...)->header(...)),需显式追加 charset。











