必须将MySQL服务端、数据库、表、JSON字段字符集统一设为utf8mb4,并在Laravel配置中同步设置charset、collation及PDO初始化命令,否则插入Emoji会报1366错误或显示问号。

在 Laravel 中向 MySQL 的 JSON 字段写入包含 Emoji 的数据时,如果数据库表字符集不是 utf8mb4 或连接未启用对应编码,会触发 “SQLSTATE[HY000]: General error: 1366 Incorrect string value” 错误,导致插入失败或 Emoji 被替换成问号。
确认 MySQL 服务端支持 utf8mb4
登录 MySQL 命令行,执行:SHOW VARIABLES LIKE 'character_set_server'; → 若返回值不是 【utf8mb4】,需修改 MySQL 配置文件(my.cnf 或 my.ini),在 [mysqld] 下添加:character-set-server = utf8mb4 并重启 MySQL 服务。不改此项,后续所有应用层设置都无效。
修改数据库、表及 JSON 字段的字符集
进入目标数据库后,依次执行以下命令:
① 修改数据库默认字符集:ALTER DATABASE `your_database_name` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
② 修改数据表字符集:ALTER TABLE `your_table_name` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
③ 单独确认 JSON 字段是否已继承 utf8mb4:执行 SHOW CREATE TABLE your_table_name;,检查字段定义中是否含 CHARACTER SET utf8mb4。若无,需显式修改该字段:ALTER TABLE `your_table_name` MODIFY `your_json_column` JSON CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; —— 这一步常被忽略,但 JSON 类型字段仍受表级字符集约束,必须显式指定。
配置 Laravel 数据库连接使用 utf8mb4
打开 config/database.php,找到 mysql 配置块,在 'charset' 和 'collation' 两项中分别设为:'charset' => 'utf8mb4' 和 'collation' => 'utf8mb4_unicode_ci'。
同时在 'options' 数组中追加 PDO 属性:PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci" —— 这能确保每次连接建立时强制执行编码声明,避免因连接复用导致的临时编码错乱。
验证 Laravel 模型写入是否生效
在 Tinker 中执行:DB::table('your_table_name')->insert(['your_json_column' => json_encode(['msg' => 'Hello ??'], JSON_UNESCAPED_UNICODE)]);
若成功插入且查出的记录中 Emoji 显示完整,说明配置完成。若仍报错,请检查 MySQL 用户权限是否允许执行 SET NAMES 命令 —— 某些云数据库(如阿里云 RDS)默认禁用该指令,此时需移除 PDO::MYSQL_ATTR_INIT_COMMAND 行,转而依赖连接字符串中的 ?charset=utf8mb4&collation=utf8mb4_unicode_ci 参数。

















