【オリジナル】MySQL 5.7 JSONタイプ使用紹介

4812 ワード

JSONは軽量レベルのデータ交換フォーマットで、言語から独立したテキストフォーマットを採用しており、XMLに似ているが、XMLより簡単で、読みやすく、書きやすい.機械にとって解析と生成が容易であり,ネットワーク帯域幅の伝送が減少する.
JSONのフォーマットは非常に簡単です:名前/キー値.以前はMySQLバージョンでこのようなストレージを実現するには、VARCHARを使用するか、TEXTの大きなテキストを使用します.MySQL5.7リリース後、JSONデータ型およびそのタイプに関する検索およびその他の関数解析を専門に設計した.まずMySQLの古いバージョンのJSONアクセスを見てみましょう.
表構造の例:
CREATE TABLE json_test(
id INT,
person_desc TEXT
)ENGINE INNODB;

レコードを挿入します.
INSERT INTO json_test VALUES (1,'{
    "programmers": [{
        "firstName": "Brett",
        "lastName": "McLaughlin",
        "email": "aaaa"
    }, {
        "firstName": "Jason",
        "lastName": "Hunter",
        "email": "bbbb"
    }, {
        "firstName": "Elliotte",
        "lastName": "Harold",
        "email": "cccc"
    }],
    "authors": [{
        "firstName": "Isaac",
        "lastName": "Asimov",
        "genre": "sciencefiction"
    }, {
        "firstName": "Tad",
        "lastName": "Williams",
        "genre": "fantasy"
    }, {
        "firstName": "Frank",
        "lastName": "Peretti",
        "genre": "christianfiction"
    }],
    "musicians": [{
        "firstName": "Eric",
        "lastName": "Clapton",
        "instrument": "guitar"
    }, {
        "firstName": "Sergei",
        "lastName": "Rachmaninoff",
        "instrument": "piano"
    }]
}');

それは一般的にJSONフォーマットを格納するためにこのレコードを取り出してアプリケーションに渡すしかなく、アプリケーションが解析しています.
今MySQL 5に着きました.7次の表の構造を変更します.
ALTER TABLE json_test MODIFY person_desc json;

まず、挿入されたこの行JSONデータのKEYを見てみましょう.
mysql> SELECT id,json_keys(person_desc) as "keys" FROM json_test\G
*************************** 1. row ***************************
  id: 1
keys: ["authors", "musicians", "programmers"]
1 row in set (0.00 sec)

中にはauthors,musicians,programmersの3つのKEYがあります.では、KEYを探して対応する値を出します.
mysql> SELECT json_extract(AUTHORS,'$.lastName[0]') AS 'name', AUTHORS FROM
    -> (
    -> SELECT id,json_extract(person_desc,'$.authors[0][0]') AS "authors" FROM json_test
    -> UNION ALL
    -> SELECT id,json_extract(person_desc,'$.authors[1][0]') AS "authors" FROM json_test
    -> UNION ALL
    -> SELECT id,json_extract(person_desc,'$.authors[2][0]') AS "authors" FROM json_test
    -> ) AS T1
    -> ORDER BY NAME DESC\G
*************************** 1. row ***************************
   name: "Williams"
AUTHORS: {"genre": "fantasy", "lastName": "Williams", "firstName": "Tad"}
*************************** 2. row ***************************
   name: "Peretti"
AUTHORS: {"genre": "christianfiction", "lastName": "Peretti", "firstName": "Frank"}
*************************** 3. row ***************************
   name: "Asimov"
AUTHORS: {"genre": "sciencefiction", "lastName": "Asimov", "firstName": "Isaac"}
3 rows in set (0.00 sec)

詳細な値を羅列します.
mysql> SELECT
    -> json_extract(AUTHORS,'$.firstName[0]') AS "firstname",
    -> json_extract(AUTHORS,'$.lastName[0]') AS "lastname",
    -> json_extract(AUTHORS,'$.genre[0]') AS "genre"
    -> FROM
    -> (
    -> SELECT id,json_extract(person_desc,'$.authors[0]') AS "authors" FROM json
_test
    -> ) AS T\G
*************************** 1. row ***************************
firstname: "Isaac"
 lastname: "Asimov"
    genre: "sciencefiction"
1 row in set (0.00 sec)

さらにauthorsというKEYに対応するすべてのオブジェクトを削除することを実証する.
mysql> UPDATE json_test
    -> SET person_desc = json_remove(person_desc,'$.authors')\G
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

対応するKEYを検索すると、削除されていることがわかります.
mysql> SELECT json_contains_path(person_desc,'all','$.authors') as authors_exist
s FROM json_test\G
*************************** 1. row ***************************
authors_exists: 0
1 row in set (0.00 sec)

まとめるとMySQL 5.7からJSONデータ型をサポートしていますが、使用する場合は、このような値を取り出してアプリケーションセグメントで計算することをお勧めします.結局、データベースは簡単なデータを処理するために使用されています.