帮助中心/最新通知

质量为本、客户为根、勇于拼搏、务实创新

< 返回文章列表

【服务器相关】MySQL存储Json字符串遇到的问题与解决方法

发表时间:2025-06-16 03:46:00 小编:主机乐-Yutio

环境依赖

Python 2.7
MySQL 5.7
MySQL-python 1.2.5
Pandas 0.18.1

在日常的数据处理中,免不了需要将一些序列化的结果存入到MySQL中。这里以插入JSON数据为例,讨论这种问题发生的原因和解决办法。现在的MySQL已经支持JSON数据格式了,在这里不做讨论;主要讨论如何保证存入到MySQL字段中的JsonString能被正确解析。

问题描述

原因分析

对于字符串中包含引号等其他特殊符号的处理思路在大多数编程语言中都是相通的:即就是通过转义符来保留所需要的特殊字符。Python中也不例外,如上所示,对于一个字典{"value": "<img src="xxx.jpg">", "name": "小明"},要想在编译器里正确的表示它,就需要通过对转义包裹xxx.jps的两个双引号,不然会提示错误,所以它的正确写法为:{"value": "<img src=\"xxx.jpg\">", "name": "小明"};将序列化后的String作为参数传入待执行的sql语句中,通过编辑器的debug模式查看的效果如下所示:

而这句sql经过编译器解析后传入到MySQL去执行的本质为:'update demo set msg = '{"source": "<img src="xxx.jpg">", "type": "图片"}' where id = '1',因此落库的实际结果其实并不是目标字典对应的序列化结果,而是目标数据对应的字面字符串值。

解决方案

可以通过转义符替换、修改sql书写方式或通过DataFrame.to_sql()三种方式来解决。

方案一 转义符替换

通过上文可以了解到,是因为\\"xxx.jpg\\"的本质即就是"xxx.jpg",所以数据库读到的也就是{"source": "<img src="xxx.jpg">", "type": "图片"},从而导致插入的结果并不能被正确反序列化。可以通过简单粗暴的转义符替换方式来解决这个问题:json_str.replace('\\', '\\\\'),这样就保证最终的解析结果为\"xxx.jpg\"

方案二 修改sql书写方式

推荐使用

方案三 DataFrame.to_sql()

处理数据离不开Panda工具包;Pandas的DataFrame.to_sql()方法可以便捷有效的实现数据的插入需求;同样该方法也能有效的规避上述这种序列化结果错误的情况,因为DataFrame.to_sql()底层的实现逻辑类似于方案二,也是通过参数解析的方式来拼接sql语句,核心源码如下所示,同于不难发现,DataFrame.to_sql()只能支持insert操作,适用场景比较局限。对于有唯一索引的表,当待插入数据与数据表中有冲突时会报错,实际使用时需要格外注意。


def insert_statement(self):
names = list(map(text_type, self.frame.columns))
flv = self.pd_sql.flavor
wld = _SQL_WILDCARD[flv]# wildcard char
escape = _SQL_GET_IDENTIFIER[flv]

if self.index is not None:
[names.insert(0, idx) for idx in self.index[::-1]]

bracketed_names = [escape(column) for column in names]
col_names = ‘,’.join(bracketed_names)
wildcards = ‘,’.join([wld] * len(names))
# 只支持Insert操作
insert_statement = ‘INSERT INTO %s (%s) VALUES (%s)’ % (
escape(self.name), col_names, wildcards)
return insert_statement

补充:

补充:不同情况

1.模糊查询json类型字段

存储的数据格式(字段名 people_json):


{“name”: “zhangsan”, “age”: “13”, “gender”: “男”}

代码如下(示例):


select * from table_namewhere people_json->’$.name’ like ‘%zhang%’

2.精确查询json类型字段

存储的数据格式(字段名 people_json):


{“name”: “zhangsan”, “age”: “13”, “gender”: “男”}

代码如下(示例):


select * from table_namewhere people_json-> ‘$.age’ = 13

3.模糊查询JsonArray类型字段

存储的数据格式(字段名 people_json):


[{“name”: “zhangsan”, “age”: “13”, “gender”: “男”}]

代码如下(示例):


select * from table_namewhere people_json->’$[*].name’ like ‘%zhang%’

4.精确查询JsonArray类型字段

存储的数据格式(字段名 people_json):


[{“name”: “zhangsan”, “age”: “13”, “gender”: “男”}]

代码如下(示例):

总结

到此这篇关于MySQL存储Json字符串遇到的问题与解决方法的文章就介绍到这了,更多相关MySQL存储Json字符串内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

正在回复: 取消回复

发表评论

暂无评论
成为第一个留下见解的人

联系我们
返回顶部