Type:JSONに、INSERTができない人へ


現状の問題

MySQL version 5.7.30

MySQLで、type:jsonの列を作ったのですが、なぜかinsertできませんでした。

解決策: json_encodeを使用する

まず、テーブルを作ります。(type:jsonの列あり)

create table sample_json(id int, json_data json);

次にこうすればinsertできるはずなのですが..できない。なんでや..

insert into sample_json values(1, '{"from" : "Japan", "name" : "Taro"}');

↓ 修正

insert into sample_json values(1, "{\"from\": \"Japan\", \"name\": \"Taro\"}");

データベースに登録されました〜やったね!

解説

なぜ、こんな変な形にしたらいけるんでしょうか?
文字列をjson形式に変換しないといけないからです。(以下のような変換です。)

'{"from" : "Japan", "name" : "Taro"}' → "{\"from\": \"Japan\", \"name\": \"Taro\"}"
# 変数jsonを定義
$json = '{"from" : "Japan", "name" : "Taro"}';
# json_encode(?, JSON_UNESCAPED_UNICODE)で、日本語状態で、文字列をjson形式に変換。
# json_encodeだけだと、jsonの最初と最後に「"」がついてしまうので、mb_substr()を2つ使い、それらを削除。
$newjson = 
 mb_substr(
  mb_substr(
   json_encode($json, JSON_UNESCAPED_UNICODE)
  , 1)
 , 0, -1);
# 出力: {\"from\" : \"Japan\", \"name\" : \"Taro\"}
print($newjson);

参考
【MySQL】JSON型のカラムを操作する場合の落とし穴
MySQLでJSONデータを扱ってみよう!JSON型の使い方とは?
【JavaScript】javascriptでのデータオブジェクトのkeyに「:(コロン)」があるときのアクセス