周五下午3点,你正美滋滋地准备把本周最后一个功能部署上线 🚀,突然,测试同事发来消息:"数据库报错了!JSON字段插入失败!" 你打开日志一看,赫然出现:
ERROR 3144 (22032): Invalid JSON character data provided to function: invalid character set for JSON text
你揉了揉眼睛:"这JSON昨天还好好的,怎么今天就闹脾气了?" 别急,让我们一起拆解这个让无数开发者头疼的MySQL JSON字符集问题!
MySQL对JSON数据有严格的字符集要求:
-- 查看数据库默认字符集 SHOW VARIABLES LIKE 'character_set_database'; -- 查看表字符集 SHOW CREATE TABLE 你的表名; -- 查看列字符集(特别是JSON列) SELECT column_name, character_set_name FROM information_schema.columns WHERE table_schema = '你的数据库名' AND table_name = '你的表名';
-- 尝试直接插入简单JSON测试 INSERT INTO 你的表名(json_column) VALUES ('{"test": "正常文本"}'); -- 尝试插入包含特殊字符的JSON INSERT INTO 你的表名(json_column) VALUES ('{"emoji": "😊"}');
-- 修改表的默认字符集 ALTER TABLE 你的表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 单独修改JSON列(如果其他列需要保留原字符集) ALTER TABLE 你的表名 MODIFY json_column JSON CHARACTER SET utf8mb4;
-- 在插入时强制转换 INSERT INTO 你的表名(json_column) VALUES (CONVERT('{"emoji": "😊"}' USING utf8mb4)); -- 或者使用CAST INSERT INTO 你的表名(json_column) VALUES (CAST('{"emoji": "😊"}' AS CHAR CHARACTER SET utf8mb4));
在应用连接字符串中添加字符集参数:
jdbc:mysql://localhost:3306/数据库?useUnicode=true&characterEncoding=utf8mb4
或者在MySQL客户端中执行:
SET NAMES utf8mb4;
当你在远程服务器遇到这个问题:
导出数据时:确保使用正确的字符集
mysqldump -u 用户 -p --default-character-set=utf8mb4 数据库名 > 备份.sql
导入数据时:先确认目标数据库字符集
CREATE DATABASE 新数据库 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
批量修改已有数据:
UPDATE 你的表名 SET json_column = CAST(CONVERT(json_column USING utf8) AS JSON CHARACTER SET utf8mb4);
新建数据库规范:
CREATE DATABASE 新数据库 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
应用层检查:
# Python示例:插入前验证 import json try: json.dumps(your_data, ensure_ascii=False).encode('utf8mb4') except UnicodeEncodeError: print("包含不支持的字符!")
监控特殊字符:
-- 查找可能出问题的记录 SELECT * FROM 你的表名 WHERE json_column REGEXP '[^\x00-\x7F]';
本文由 封煦 于2025-07-30发表在【云服务器提供商】,文中图片由(封煦)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/488402.html
发表评论