Python 2.7
MySQL 5.7
MySQL-python 1.2.5
Pandas 0.18.1
在日常的数据处理中,免不了需要将一些序列化的结果存入到MySQL中。这里以插入JSON数据为例,讨论这种问题发生的原因和解决办法。现在的MySQL已经支持JSON数据格式了,在这里不做讨论;主要讨论如何保证存入到MySQL字段中的JsonString能被正确解析。
# -*- coding: utf-8 -*-
import MySQLdb
import json
mysql_conn = MySQLdb.connect(host='localhost', user='root', passwd='root', db='test', port=3306, charset='utf8')
mysql_cur = mysql_conn.cursor()
increment_id = 1
dic = {"value": "<img src=\"xxx.jpg\">", "name": "小明"}
json_str = json.dumps(dic, ensure_ascii=False)
sql = "update demo set msg = '{0}' where id = '{1}'".format(json_str, increment_id)
mysql_cur.execute(sql)
mysql_conn.commit()
mysql_cur.close()
应用场景抽象如上所示,将一个字典经过经过Json序列化后作为一个表字段的值存入到Mysql中,按照如上的方式更新数据时,发现落库的JsonString反序列化失败;落库结果和反序列化结果分别如下所示:
1、拷贝lib_mysqludf_json_parsing.dll到mysql目录C:\Program Files\MariaDB 5.5\lib\plugin下
2、在数据库中执行
DROP FUNCTION json_get;
CREATE FUNCTION json_get RETURNS STRING SONAME 'lib_mysqludf_json_parsing.dll';
SELECT json_get('{"a":1}', 'a') => 1
SELECT json_get('{"a":1}', 'b') => NULL
SELECT json_get('[1,2,3]', 2) => 3
SELECT json_get('{"a":[2]}', 'a', 0) => 2
JSON 数据类型是 MySQL 5.7.8 开始支持的。在此之前,只能通过字符类型(CHAR,VARCHAR 或 TEXT )来保存 JSON 文档。
MySQL 8.0版本中增加了对JSON类型的索引支持。可以使用CREATE INDEX语句创建JSON类型的索引,提高JSON类型数据的查询效率。
存储JSON文档所需的空间与存储LONGBLOB或LONGTEXT所需的空间大致相同。
在MySQL 8.0.13之前,JSON列不能有非空的默认值。
JSON 类型比较适合存储一些列不固定、修改较少
在MySQL5.7.8之后开始支持一种可高效获取JSON文本中数据的原生JSON类型,该类型具有以下优点:
存储时自动验证,验证不通过将报错
更好的存储结构。采用一种针对告诉读取JSON文本元素的内部结构进行存储。新的服务器是以二进制的格式读取一个JSON文本,而不是以字符串格式读取然后进行转换。这种二进制格式允许服务器在文本中通过键或者数组索引获取其子对象(嵌套数组)而不需要读取全部值
另外,系统对JSON格式做了一些限制:
JSON文本的最大长度取决有系统常量:max_allowed_packet。该值仅在服务器进行存储的时候进行限制,在内存中进行计算的时候是允许超过该值的。
JSON是一种轻量级的数据交换格式,采用了独立于语言的文本格式,类似XML,但是比XML简单,易读并且易编写。对机器来说易于解析和生成,并且会减少网络带宽的传输。
JSON的格式非常简单:名称/键值。之前MySQL版本里面要实现这样的存储,要么用VARCHAR要么用TEXT大文本。 MySQL5.7发布后,专门设计了JSON数据类型以及关于这种类型的检索以及其他函数解析。
下面一起来实际操作一下。
创建带有 JSON 字段的表
比如一个‘文章’表,字段包括
id、标题 title、标签 tags
一篇文章会有多个标签,tags 就可以设为 JSON 类型
建表语句如下:
CREATE
基于MySQL 8 JSON类型和PHP 8构建的JSON存储
警告:高度实验性的项目
使用MySQL 5.7和JSON comumn类型,就可以将MySQL用作NoSQL。
通过添加从JSON列派生的虚拟列和存储列,我们就能以高效的方式查询那些对象。
这使您能够
将JSON存储在MySQL中
能够使用简单的get / set / delete API
与常规表一样查询数据
经过MySQL 8.0和PHP 8的测试。
使用简化的通用时间标识符而不是UUID(UTID)。 UTID被传输并存储为9个字符的ID(72位),代表以纳秒为单位的时间戳。
UTID仅使用- , AZ , az和_以此顺序编码为64个基本字符串,从而使UTID可以及时排序,因为将数字转换为char可以保持其排序能力。
使用Composer安装
编辑composer.json
在 MySQL 5.7.8 及以上版本中,可以使用 JSON 数据类型存储和操作 JSON 数据。如果要解析 JSON 字符串,可以使用 MySQL 的 JSON 函数来实现。
以下是一些常用的 JSON 函数:
1. JSON_EXTRACT():从 JSON 字符串中提取指定的键值对。
2. JSON_VALUE():从 JSON 字符串中提取指定的值或键值对。
3. JSON_SET():向 JSON 字符串中添加或更新键值对。
4. JSON_REMOVE():从 JSON 字符串中删除指定的键值对。
例如,假设有一个名为 `employees` 的表,其中包含一个名为 `info` 的 JSON 类型的列。下面的示例演示了如何使用 JSON_EXTRACT() 函数从 JSON 字符串中提取数据:
```sql
SELECT JSON_EXTRACT(info, '$.name') AS name, JSON_EXTRACT(info, '$.age') AS age
FROM employees;
这将从 `info` 列中提取 `name` 和 `age` 键的值,并返回一个结果集。
请注意,JSON 函数仅适用于 MySQL 5.7.8 及以上版本。如果您的 MySQL 版本低于此版本,则无法使用这些函数。