向Mysql数据库藏储json编码的中文会乱码是什么原因

老实说,我已经多次看到这种情况发生,这绝对是荒谬的。
想一想。
如果你在 MySQL 中保存带有表情符号的 JSON,并且输出的代码不正确,那一刻你真的会想要让你的计算机崩溃。
这一切背后都有一场编码之战。

有一次,我在杭州做一个项目。
客户端服务器使用较旧的 GB2 3 1 2 系统。
我们使用 UTF-8 进行本地开发。
结果,数据在传输时出现了失真。
当时记录的数据为:{"name":"张三","emoji":":)"},直接在数据库中转换为{"name":"\xe5 \xbe\xac\xe4 \xb8 \x9 d","emoji":"\xf0\x9 f\x9 8 \x8 e"}。
这就像玩摩尔斯电码。

要解决这个问题,你必须像侦探一样寻找线索。
首先,查看您的数据库编码。
类型显示变量如“character_set_database”;在 MySQL 中。
如果显示utf8 mb4 则正常。
如果看到gb2 3 1 2 ,则需要更改。
我通常使用 ALTER DATABASE your_db_name CHARACTER SET utf8 mb4 COLLATE utf8 mb4 _unicode_ci;可以存储4 个字节的字符。

有趣的是,仅仅更改数据库是不够的。
在 PHP 中, header('Content-Type: text/;charset=utf-8 ');否则,浏览器默认为 ISO-8 8 5 9 -1 在Java中,这类似于response.setContentType("text/;charset=UTF-8 ");这些细节是最容易被忽视的。

最容易受到攻击的部分是 JSON 创建过程。
在 JavaScript 中编写 JSON.stringify() 时,不能像这样编写 JSON.stringify(obj, null, 'utf-8 ') 。
这样写完全没用。
确保对象中的中文字符采用UTF-8 编码。
我通常在 Node.js 中使用 new TextEncoder().encode('English') 在保存之前转换字节。

一个特别令人沮丧的情况是,如果您使用 Postman 测试您的界面,那没问题,但如果您将其部署到服务器,您的代码可能会崩溃。
后来发现是服务器环境变量LANG设置不正确。
在 Linux 上,您需要更改 /etc/locale.conf,在 Windows 上,您需要更改系统区域设置。

如果数据量太多,还有一个技巧。
首先保存二进制文件并使用 SET @json_data = CAST('{"中文":1 2 3 }' AS BLOB);输入 INSERT INTO table_name (json_col) VALUES (@json_data);然后在确认后将其转换回 JSON。
它很慢,但完全没有错误。

我自己没有遇到过这种NoSQL场景,但感觉和MongoDB很相似。
您应该检查 db.getMongo().getDB('your_db').getCollection('your_col').find().forEach(printjson); 的输出关键是当字符断掉的时候,可以使用printf('%.2 00s', $json)读取前2 00个字符。
这比直接打印 json 有用得多。

在更改编码之前,不要忘记保存并备份数据的完整备份。
上次我更改编码时,我发现我忘记在凌晨 3 点备份某些关联表。
当时我的血压飙升到1 8 0,花了2 个小时才恢复数据,然后老板说要自己扣钱。

其实现在建数据库的时候,最简单的办法就是不管GB2 3 1 2 ,直接选择utf8 mb4 如今,人们仍然使用五笔打字。
有。
如果客户坚持的话,我们建议使用阿里云RDS,系统层会自动转换编码。
请您解除后顾之忧。

为什么MySQL直接从5.7升级到了8.0?

直接说结论吧。

5 .7 L 8 .0主要是解决老版本的问题,同时引入新的功能。

跳过 6 .0 和 7 .0 版本并更频繁地发布。

utf8 mb4 成为默认字符集并支持完整的 Unicode。

事务数据字典、元数据统一存储,解决数据损坏和性能问题。

SQL 解析器重构以优化 DDL 操作。

添加隐形索引,测试风险低。

优化了 JSON 索引和处理等细节。

坦白说,为了解决5 .7 中的许多破损问题并添加新功能,我们将继续升级到更大的版本。

MySQL8.0对比MySQL5.7的性能提升及优化