MySQL 5.7.7 Release Candidateと同時にLabs(実験室)版としてMySQL JSONがリリースされました。MySQL JSONでは新しいデータ型としてJSON型をサポートしています。JSON型は格納されるデータ形式が正しいかを自動的にチェックするDocument Validationを持ち、またJSONドキュメントをバイナリ化して格納することで参照性能の向上を図っています。またMySQL 5.7.6で実装されたGenerated Column(生成列)を活用することで、functional indexes(関数インデックス)の形でインデックスを利用できます。
関連情報(MySQL Server Teamブログ):
機能概要 JSON Labs Release: Native JSON Data Type and Binary Format | MySQL Server Blog
データ変更 JSON Labs Release: JSON Functions, Part 1 — Manipulation JSON Data | MySQL Server Blog
データ参照 JSON Labs Release: JSON Functions, Part 2 — Querying JSON Data | MySQL Server Blog
インデックス JSON Labs Release: Effective Functional Indexes in InnoDB | MySQL Server Blog
MySQL JSONはソースコードとLinux用バイナリが下記からダウンロード可能です。ただし、Labs(実験室)版はテスト用途として公開されており本番環境での利用には適しません。
MySQL :: MySQL Labs
まずはMySQL 5.7なのでmysql_install_dbではなくてmysqldの --initialize-insecure オプションで初期化。
MySQLサーバは --character-set-server=utf8mb4 を付けて起動。
クライアントは --default-character-set=utf8mb4 を付けてMySQLサーバに接続し、
データベースを作成そしてテーブルを作ります。
mysql> CREATE TABLE t1 (id SERIAL, info JSON) DEFAULT CHARSET=utf8mb4; Query OK, 0 rows affected (0.08 sec) mysql> SHOW CREATE TABLE t1 \G *************************** 1. row *************************** Table: t1 Create Table: CREATE TABLE `t1` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `info` json DEFAULT NULL, UNIQUE KEY `id` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 1 row in set (0.00 sec)
3行ほどデータを流し込んでみます。
mysql> INSERT INTO t1(info) VALUES ('{"id":1,"Name":"Farmer grandmas","price":50000,"Conditions":["farms",15]}'); mysql> INSERT INTO t1(info) VALUES ('{"id":2,"Name":"Worker grandmas","price":300000,"Conditions":["factories",15]}'); mysql> INSERT INTO t1(info) VALUES ('{"id":3,"Name":"グランマ","price":300000,"Conditions":["factories",15]}');
jsn_extract()関数は指定したキーの値を取得するSQL関数です。
mysql> SELECT jsn_extract(info, '$.Name') FROM t1; +-----------------------------+ | jsn_extract(info, '$.Name') | +-----------------------------+ | "Farmer grandmas" | | "Worker grandmas" | | "グランマ" | +-----------------------------+ 3 rows in set (0.00 sec)
日本語の照合も何となくできているようです。
mysql> SELECT jsn_extract(info, '$.Name')='グランマ' FROM t1; +--------------------------------------------+ | jsn_extract(info, '$.Name')='グランマ' | +--------------------------------------------+ | 0 | | 0 | | 1 | +--------------------------------------------+ 3 rows in set (0.00 sec)
'🍣'='🍺'がどうなるかは、試してみて下さい。