如何从存储在序列化JSON列中的Mysql列中提取数据?

如何从存储在序列化JSON列中的Mysql列中提取数据?,mysql,serialization,Mysql,Serialization,我在mysql数据库中有一列,其中包含序列化的数据(使用PHP JSON编码对它们进行序列化) 以下是一个例子: {“名称”:“集团有限公司”,“电子邮件”:support@domain.org“,“auth”:“Andrey Ucholnik”} mysql中是否有一个内置函数可以在不使用PHP的情况下提取这些值? 我的意思是构建一个将数据非序列化的查询 当然,可以使用LOCATE和SUBSTR函数的组合来实现这一点,但如果可能的话,我更喜欢内置函数。MySQL中没有内置函数,但通过使用PHP

我在mysql数据库中有一列,其中包含序列化的数据(使用PHP JSON编码对它们进行序列化)

以下是一个例子:

{“名称”:“集团有限公司”,“电子邮件”:support@domain.org“,“auth”:“Andrey Ucholnik”}

mysql中是否有一个内置函数可以在不使用PHP的情况下提取这些值? 我的意思是构建一个将数据非序列化的查询


当然,可以使用LOCATE和SUBSTR函数的组合来实现这一点,但如果可能的话,我更喜欢内置函数。

MySQL中没有内置函数,但通过使用PHP中的小代码,您可以轻松完成以下操作:

<?php
    $json = '{{"generated": "2010-02-26T22:26:03.156866   blahblahblah   ": null, "thumbnail_url": "http://thumbs.mochiads.com/c/g/tetword-pro/_thumb_100x100.jpg", "screen4_url": "http://thumbs.mochiads.com/c/g/tetword-pro/screen4.png", "leaderboard_enabled": true, "resolution": "600x550", "width": 600}]}}';
    $out = json_decode($json, true);
    foreach($out["games"] as $game) {
        $name = addslashes($game[name]);
        $description = addslashes($game[description]);
        //Here you can use your mysql_insert code
        mysql_query("INSERT INTO games (name, description) VALUES('$name', '$description')") or die (mysql_error());
    } 
?>

没有内置的MySQL函数来处理JSON,但这里有一个非常简单的存储函数来从JSON中提取值:

DELIMITER $$
CREATE FUNCTION JSON_EXTRACT(json TEXT, name CHAR(64))
RETURNS CHAR(64) DETERMINISTIC
BEGIN
    SET @namePos = LOCATE(name, json);
    IF @namePos = 0 THEN RETURN ''; END IF;
    SET @valuePos = LOCATE(':', json, @namePos) + 1;
    IF SUBSTR(json, @valuePos, 1) = '"' THEN
        SET @valuePos = @valuePos + 1;
        RETURN SUBSTR(json, @valuePos, LOCATE('"', json, @valuePos) - @valuePos);
    ELSE
        SET @valueBegin = TRIM(SUBSTR(json, @valuePos));
        SET @delim1 = LOCATE(' ', @valueBegin); SET @delim1 = IF(@delim1 = 0, 64, @delim1);
        SET @delim2 = LOCATE(',', @valueBegin); SET @delim2 = IF(@delim2 = 0, 64, @delim2);
        SET @delim3 = LOCATE('}', @valueBegin); SET @delim3 = IF(@delim3 = 0, 64, @delim3);
        RETURN LEFT(@valueBegin, LEAST(@delim1, @delim2, @delim3) - 1);
    END IF;
END$$
用法示例:

SELECT JSON_EXTRACT('{"a":"aa","b" : 1, "c": 3}', 'b') AS test;

请注意,该函数有许多限制。例如,它不处理嵌套类,键名不应包含在值中。

是的,您完全可以在mysql中使用JSON_EXTRACT()函数来处理它

让我们看一个包含JSON的表(这里的表
client\u services
):

要选择每个JSON字段,请运行以下查询:

SELECT 
    id, client_id, 
    json_extract(service_values, '$.quota') AS quota,
    json_extract(service_values, '$.data_transfer') AS data_transfer
FROM client_services;
因此,输出将是:

+-----+-----------+----------------------+
| id  | client_id | quota | data_transfer|
+-----+-----------+----------------------+
| 100 |      1000 |     1 |       160000 |
| 101 |      1000 |     2 |       800000 |
| 102 |      1000 |     3 |        70000 |
| 103 |      1001 |     1 |        97000 |
| 104 |      1001 |     2 |         1760 |
| 105 |      1002 |     2 |         1060 |
+-----+-----------+----------------------+
希望这有帮助

+-----+-----------+----------------------+
| id  | client_id | quota | data_transfer|
+-----+-----------+----------------------+
| 100 |      1000 |     1 |       160000 |
| 101 |      1000 |     2 |       800000 |
| 102 |      1000 |     3 |        70000 |
| 103 |      1001 |     1 |        97000 |
| 104 |      1001 |     2 |         1760 |
| 105 |      1002 |     2 |         1060 |
+-----+-----------+----------------------+