動かざることバグの如し

近づきたいよ 君の理想に

MariaDBでJSON型を使う

使いたい人生だった

Qittaのとある記事みてMySQL5.7から追加されたJSON型で遊んでみたくなった。さっそく手元のDBで試そうと思ったら

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'JSON

ファーーーーーーーーーーーってそういえば手元のDBMySQLじゃなくてMariaDBだったは(

で終わり、は流石にアレなのでMariaDBDynamic Columnsで遊んでみた

環境

試す

まずは適当なjson_testテーブルを作成(正確にはJSONではないがJSON型があると思って作ってしまったので

CREATE TABLE `json_test` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `json` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

1つデータを追加してみる

INSERT INTO json_test VALUES (1, COLUMN_CREATE('name', 'taro', 'color', 'red'));

いけたのでもう1つ適当に

INSERT INTO json_test VALUES (2, COLUMN_CREATE('name', 'hanako', 'color', 'black'));

見てみよう

mysql> SELECT * from json_test
+----+-------------------------------------+
| id | json                                |
+----+-------------------------------------+
|  1 |           S namecolor!taro!red     |
|  2 |           s namecolor!hanako!black |
+----+-------------------------------------+

お、おう?

中身も表示させたい場合は COLUMN_JSONを使うといい感じ。JSONで取れるの便利

mysql> select id, COLUMN_JSON(json) from json_test;
+----+-----------------------------------+
| id | COLUMN_JSON(json)                 |
+----+-----------------------------------+
|  1 | {"name":"taro","color":"red"}     |
|  2 | {"name":"hanako","color":"black"} |
+----+-----------------------------------+

JSONの特定の要素のみ取得したい場合はCOLUMN_GET

mysql> select id, COLUMN_GET(json, 'name' AS char) AS name from json_test;
+----+--------+
| id | name   |
+----+--------+
|  1 | taro   |
|  2 | hanako |
+----+--------+

JSONに対してWHEREもかけることができる

SELECT id, COLUMN_JSON(json) FROM json_test WHERE COLUMN_GET(json, 'name' AS CHAR) = 'taro';
+----+-------------------------------+
| id | COLUMN_JSON(json)             |
+----+-------------------------------+
|  1 | {"name":"taro","color":"red"} |
+----+-------------------------------+

今までにないカラムを追加してみる

INSERT INTO json_test VALUES (3, COLUMN_CREATE('name', 'piyo', 'color', 'blue', 'age', 33));

見てみよう

mysql> select id, COLUMN_JSON(json) from json_test;
+----+-----------------------------------------+
| id | COLUMN_JSON(json)                       |
+----+-----------------------------------------+
|  1 | {"name":"taro","color":"red"}           |
|  2 | {"name":"hanako","color":"black"}       |
|  3 | {"age":33,"name":"piyo","color":"blue"} |
+----+-----------------------------------------+

値のないものはNULLになる

mysql> select id, COLUMN_GET(json, 'age' AS integer) AS name from json_test;
+----+------+
| id | name |
+----+------+
|  1 | NULL |
|  2 | NULL |
|  3 |   33 |
+----+------+