【问题标题】:MySQL JSON Query sends random numbersMySQL JSON 查询发送随机数
【发布时间】:2021-09-11 01:16:23
【问题描述】:

我正在用 Python 编写一个 MySQL 查询,使用 pymysql 将 JSON 数据发送到 MySQL 表。当它发送数据时,会产生以下结果。

| id | data                                                                                                                                                                                                                                               |
+----+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 21 | 0x7B226775696C6473223A207B22383538393137313431303633343031353132223A207B226D656D62657273223A207B22343130373936333038323431303535373436223A207B22706F696E7473223A203137302C2022726166666C65735F776F6E223A20307D7D2C2022726166666C6573223A20307D7D7D |

我用来发送数据的代码如下:

        self.data_str = json.dumps(self.data)
        sql = "insert into jsondata ( data) values ('" + self.data_str + "') "
        mysql.exec_sql(sql)
        mysql.close_db()

exec_sql 函数是:

    def exec_sql(self, sql):
        # sql is insert, delete or update statement
        cursor = self.db.cursor()
        try:
            cursor.execute(sql)
            # commit sql to mysql
            self.db.commit()
            cursor.close()
            return True
        except:
            self.db.rollback()
        return False

JSON 数据的示例行是

{"guilds": {"853317141063401512": {"members": {"410846308241055746": {"points": 250, "raffles_won": 0}}, "raffles": 0}}}

我的 SQL 表设置如下:

| Field | Type   | Null | Key | Default | Extra          |
+-------+--------+------+-----+---------+----------------+
| id    | int(6) | NO   | PRI | NULL    | auto_increment |
| data  | blob   | YES  |     | NULL    |                |
+-------+--------+------+-----+---------+----------------+

【问题讨论】:

  • 你认为blob类型是什么意思?如果你知道它意味着二进制数据,你为什么要在那里存储一个字符串?
  • 哦哈哈,我不敢相信我完全忽略了这一点。谢谢

标签: python mysql sql json pymysql


【解决方案1】:

字节不是随机的。它们是 JSON 字符串中 ASCII 字节的十六进制表示。观察:

mysql> select unhex('7B226775696C6473223A207B22383538393137313431303633343031353132223A207B226D656D62657273223A207B22343130373936333038323431303535373436223A207B22706F696E7473223A203137302C2022726166666C65735F776F6E223A20307D7D2C2022726166666C6573223A20307D7D7D') as j;
+--------------------------------------------------------------------------------------------------------------------------+
| j                                                                                                                        |
+--------------------------------------------------------------------------------------------------------------------------+
| {"guilds": {"858917141063401512": {"members": {"410796308241055746": {"points": 170, "raffles_won": 0}}, "raffles": 0}}} |
+--------------------------------------------------------------------------------------------------------------------------+

您看到的是,当您将 JSON 字符串存储在二进制列 (BLOB) 中时,MySQL 会“忘记”它应该是文本,并在查询时仅转储字节的十六进制编码。

如果要存储 JSON,请使用 the JSON data type,而不是 BLOB。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    • 1970-01-01
    • 2012-11-23
    • 2021-08-24
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多