2011-02-23 83 views
2

我在包含序列化數據的mysql數據庫中使用了列(使用PHP JSON編碼來序列化它們)。如何從存儲在序列化JSON列中的Mysql列中提取數據?

下面是一個例子:

{ 「名」: 「集團有限公司」, 「電子郵件」: 「[email protected]」, 「身份驗證」: 「安德烈Ucholnik」}

有一個內置的函數在MySQL中提取這些值而不使用PHP? 我的意思是構建將反序列化數據的查詢。

當然可以使用LOCATE和SUBSTR函數的組合來實現這一點,但如果可能的話,我更喜歡內置的東西。

回答

1

有在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()); 
    } 
?> 
0

沒有內置的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; 

請注意,該功能有很多限制。例如,它不處理嵌套類,鍵名不應包含在值中。