laravel项目中文变问号、emoji存不进数据库等问题根源是mysql连接层字符集未设为utf8mb4,需同步配置mysql服务端(my.cnf中设置character-set-server=utf8mb4)、laravel连接参数(config/database.php中指定charset/collation/options),并升级已有表及迁移文件字符集。

Laravel项目上线后中文变问号、emoji存不进数据库、迁移生成的表仍是utf8编码——这些问题根源都在MySQL连接层字符集没设对,光改数据库或表结构根本无效。
确认MySQL服务端已启用utf8mb4支持
第一步:打开my.cnf(Linux)或my.ini(Windows),在[mysqld]段落里添加两行:
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
第二步:重启MySQL服务,否则配置不生效。
第三步:登录MySQL命令行,执行SHOW VARIABLES LIKE 'character_set%';,【必须确认character_set_server和character_set_database这两项值都是utf8mb4】。如果其中一项仍是utf8,说明配置未加载成功或文件路径不对。
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官方代码根本不读这个变量】。删掉它,避免误导后续维护者。
这一步操作起来很简单,直接替换config文件对应字段就行。
已有表和字段升级到utf8mb4
方法一:对单张表执行转换(适合小表)
ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
方法二:只改字段(需明确指定列名)
ALTER TABLE posts MODIFY title VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
注意:CONVERT TO会重写整张表,大表慎用;MODIFY COLUMN只影响指定字段,但不会自动更新索引排序规则,得额外执行ALTER TABLE posts MODIFY title VARCHAR(255) COLLATE utf8mb4_unicode_ci;
迁移文件里显式声明字符集
步骤一:在AppServiceProvider的boot()方法中加一句
Schema::defaultStringLength(191);
步骤二:新建迁移时,不能只写$table->string('title');
必须写成$table->string('title')->charset('utf8mb4');或者更稳妥的$table->string('title')->collation('utf8mb4_unicode_ci');
步骤三:对已存在表追加字段或修改字段,用DB::statement()手动执行ALTER语句,因为$table->string()->change()在MySQL上会触发全表重建,线上环境风险极高。











