【发布时间】:2019-07-03 17:01:47
【问题描述】:
我正在尝试使用 JSON_EXTRACT 从我的 MariaDB 服务器获取 JSON 值。但是,有些 JSON 键有很多空格,如行尾、空格、制表符等。数据已经存在。因此我无法给出正确的密钥名称,因为密钥包含空格。请注意,JSON 值中也存在空格,但我们可以使用 TRIM() 函数从值中删除空格。但是我们可以做些什么来修剪键名呢?
例如:
CREATE TABLE test.product_json_table (
id INT AUTO_INCREMENT NOT NULL,
product VARCHAR(20) NOT NULL,
description LONGTEXT ASCII,
PRIMARY KEY (id),
CHECK (JSON_VALID(description))
) ENGINE = InnoDB ROW_FORMAT = DEFAULT;
INSERT INTO test.product_json_table(product, description)
VALUES( 'truck_space', '{" \r\nwheels ": 4, "seats": 3, " fuel ": "diesel", " \r\n mileage ": 8}');
以下查询不起作用:
SELECT id, product, description
FROM test.product_json_table
WHERE JSON_EXTRACT(description, '$.wheels') > 2;
查询不起作用,因为 JSON 键“轮子”中有空格。关键“里程”也是如此。
我们如何解决这个问题?提前致谢。
【问题讨论】:
-
我将通过在将输入插入数据库之前修剪输入中的空格来解决此问题。但您也可以提取带引号的密钥:
JSON_EXTRACT(description, '$." \r\nwheels "')。我现在不在 MySQL 5.7 实例附近,所以我无法对其进行测试。 -
这也与您的问题无关,但我建议使用JSON data type 而不是 LONGTEXT。
-
我只能说 GIGO。
-
感谢您的建议。我忘了提到的问题是我没有对数据库的写访问权限。它正在由另一个应用程序填充。所以让我试试比尔的建议。哦,我使用的是 MariaDB 10.2.3,因此没有 JSON 数据类型,他们建议使用 LONGTEXT。我尝试后会更新。谢谢大家!
-
瑞克,你是对的。这是一个典型的 GIGO 问题。但是垃圾被另一个我们没有太多控制权的应用程序转储到数据库中。