📣
TiDB Cloud Essential はパブリックプレビュー中です。このページは自動翻訳されたものです。原文はこちらからご覧ください。

JSONドキュメントを検証するJSON関数



TiDB は、MySQL 8.0 で利用可能なJSONスキーマ検証関数のほとんどをサポートしています。

注記:

現在、この機能はTiDB Cloud StarterおよびTiDB Cloud Essentialインスタンスではご利用いただけません。

JSON_SCHEMA_VALID()

JSON_SCHEMA_VALID(schema, json_doc)関数は、JSON ドキュメントをスキーマに対して検証し、データの整合性と一貫性を確保します。

これはチェック制約と組み合わせて使用​​することで、テーブルが変更されたときにスキーマの自動検証を行うことができます。

この関数はJSONスキーマ仕様に準拠しています。

サポートされている検証キーワードは以下のとおりです。

検証キーワード適用タイプ説明
typeどれでも型をテストします(例: arrayおよびstring )。
enumどれでも値が指定された値の配列に含まれているかどうかをテストします。
constどれでもenumと同様だが、単一の値用
allOfどれでも指定されたすべてのスキーマに一致します
anyOfどれでも指定されたスキーマのいずれかに一致する
multipleOfnumber / integer値が指定された値の倍数であるかどうかをテストします。
maximumnumber / integer値が最大値(含む)を下回っているかどうかをテストします。
exclusiveMaximumnumber / integer値が最大値(排他的)を下回っているかどうかをテストします。
minimumnumber / integer値が最小値(含む)以上かどうかをテストします。
exclusiveMinimumnumber / integer値が最小値以上かどうかをテストします(最小値以外)。
maxlengthstring値の長さが指定された値を超えていないかどうかをテストします。
minLengthstring値の長さが指定された値以上であるかどうかをテストします。
formatstring文字列が指定された形式に一致するかどうかをテストします。
patternstring文字列がパターンに一致するかどうかをテストします
itemsarray配列の要素に適用するスキーマ
prefixItemsarray配列の位置要素に適用するスキーマ
maxItemsarray配列内の項目数が指定された値を超えていないかどうかをテストします。
minItemsarray配列内の項目数が指定された値以上であるかどうかをテストします。
uniqueItemsarray配列内の項目が一意であるかどうかをテストします。 true / false
containsarray配列に含まれる項目のスキーマを設定します。
maxContainsarraycontainsと組み合わせて使用​​し、アイテムが存在できる最大回数をテストします。
minContainsarraycontainsと併用して、アイテムが存在できる最小回数をテストします。
propertiesobjectオブジェクトのプロパティに適用するスキーマ
patternPropertiesobjectプロパティ名のパターンマッチングに基づいて特定のプロパティに適用するスキーマ
additionalPropertiesobject追加のプロパティが許可されているかどうかに関わらず、 true / false
minPropertiesobjectオブジェクトが持つことができるプロパティの最小数をテストします。
maxPropertiesobjectオブジェクトが持つことができるプロパティの最大数をテストします。
requiredobject指定されたプロパティ名がオブジェクト内に存在するかどうかをテストします。

例:

いくつかの例については、このJSONドキュメントを使用してください。

{ "fruits": [ "orange", "apple", "pear" ], "vegetables": [ "carrot", "pepper", "kale"] }

ユーザー定義変数を使用して JSON ドキュメントを保持します。

SET @j := '{"fruits": ["orange", "apple", "pear"], "vegetables": ["carrot", "pepper", "kale"]}';

まず、型のテストから始めましょう。

SELECT JSON_SCHEMA_VALID('{"type": "object"}',@j);
+--------------------------------------------+ | JSON_SCHEMA_VALID('{"type": "object"}',@j) | +--------------------------------------------+ | 1 | +--------------------------------------------+ 1 row in set (0.00 sec)
SELECT JSON_SCHEMA_VALID('{"type": "array"}',@j);
+-------------------------------------------+ | JSON_SCHEMA_VALID('{"type": "array"}',@j) | +-------------------------------------------+ | 0 | +-------------------------------------------+ 1 row in set (0.00 sec)
mysql> SELECT JSON_TYPE(@j);
+---------------+ | JSON_TYPE(@j) | +---------------+ | OBJECT | +---------------+ 1 row in set (0.00 sec)

上記の出力で確認できるように、 @jのタイプはobjectです。これはJSON_TYPE()の出力と一致します。

次に、特定の属性の存在を確認します。

SELECT JSON_SCHEMA_VALID('{"required": ["fruits","vegetables"]}',@j);
+---------------------------------------------------------------+ | JSON_SCHEMA_VALID('{"required": ["fruits","vegetables"]}',@j) | +---------------------------------------------------------------+ | 1 | +---------------------------------------------------------------+ 1 row in set (0.00 sec)

上記の出力から、 fruitsおよびvegetables属性の存在の検証が成功していることがわかります。

SELECT JSON_SCHEMA_VALID('{"required": ["fruits","vegetables","grains"]}',@j);
+------------------------------------------------------------------------+ | JSON_SCHEMA_VALID('{"required": ["fruits","vegetables","grains"]}',@j) | +------------------------------------------------------------------------+ | 0 | +------------------------------------------------------------------------+ 1 row in set (0.00 sec)

上記の出力から、 fruitsvegetablesgrains }}属性の存在検証が、 grains存在しないため失敗していることがわかります。

fruitsが配列であることを検証します。

SELECT JSON_SCHEMA_VALID('{"properties": {"fruits": {"type": "array"}}}',@j);
+-----------------------------------------------------------------------+ | JSON_SCHEMA_VALID('{"properties": {"fruits": {"type": "array"}}}',@j) | +-----------------------------------------------------------------------+ | 1 | +-----------------------------------------------------------------------+ 1 row in set (0.01 sec)

上記の出力は、 fruitsが配列であることを確認しています。

SELECT JSON_SCHEMA_VALID('{"properties": {"fruits": {"type": "string"}}}',@j);
+------------------------------------------------------------------------+ | JSON_SCHEMA_VALID('{"properties": {"fruits": {"type": "string"}}}',@j) | +------------------------------------------------------------------------+ | 0 | +------------------------------------------------------------------------+ 1 row in set (0.00 sec)

上記の出力から、 fruitsは文字列ではないことがわかります。

次に、配列内の要素数を確認します。

SELECT JSON_SCHEMA_VALID('{"properties": {"fruits": {"type": "array", "minItems": 3}}}',@j);
+--------------------------------------------------------------------------------------+ | JSON_SCHEMA_VALID('{"properties": {"fruits": {"type": "array", "minItems": 3}}}',@j) | +--------------------------------------------------------------------------------------+ | 1 | +--------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)

上記の出力は、 fruits少なくとも 3 つの項目を持つ配列であることを示しています。

SELECT JSON_SCHEMA_VALID('{"properties": {"fruits": {"type": "array", "minItems": 4}}}',@j);
+--------------------------------------------------------------------------------------+ | JSON_SCHEMA_VALID('{"properties": {"fruits": {"type": "array", "minItems": 4}}}',@j) | +--------------------------------------------------------------------------------------+ | 0 | +--------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)

上記の出力から、 fruitsは少なくとも 4 つの項目を持つ配列ではないことがわかります。これは、最小項目数を満たしていないためです。

整数値の場合、特定の範囲内にあるかどうかを確認できます。

SELECT JSON_SCHEMA_VALID('{"type": "integer", "minimum": 40, "maximum": 45}', '42'); +------------------------------------------------------------------------------+ | JSON_SCHEMA_VALID('{"type": "integer", "minimum": 40, "maximum": 45}', '42') | +------------------------------------------------------------------------------+ | 1 | +------------------------------------------------------------------------------+ 1 row in set (0.01 sec)
SELECT JSON_SCHEMA_VALID('{"type": "integer", "minimum": 40, "maximum": 45}', '123');
+-------------------------------------------------------------------------------+ | JSON_SCHEMA_VALID('{"type": "integer", "minimum": 40, "maximum": 45}', '123') | +-------------------------------------------------------------------------------+ | 0 | +-------------------------------------------------------------------------------+ 1 row in set (0.00 sec)

文字列に対して、特定のパターンに一致するかどうかを検証できます。

SELECT JSON_SCHEMA_VALID('{"type": "string", "pattern": "^Ti"}', '"TiDB"');
+---------------------------------------------------------------------+ | JSON_SCHEMA_VALID('{"type": "string", "pattern": "^Ti"}', '"TiDB"') | +---------------------------------------------------------------------+ | 1 | +---------------------------------------------------------------------+ 1 row in set (0.00 sec)
SELECT JSON_SCHEMA_VALID('{"type": "string", "pattern": "^Ti"}', '"PingCAP"');
+------------------------------------------------------------------------+ | JSON_SCHEMA_VALID('{"type": "string", "pattern": "^Ti"}', '"PingCAP"') | +------------------------------------------------------------------------+ | 0 | +------------------------------------------------------------------------+ 1 row in set (0.00 sec)

値が特定の名前付きフォーマットに一致するかどうかを確認できます。検証可能なフォーマットには、 ipv4ipv6timedatedurationemailhostnameuuid 、およびuri

SELECT JSON_SCHEMA_VALID('{"format": "ipv4"}', '"127.0.0.1"');
+--------------------------------------------------------+ | JSON_SCHEMA_VALID('{"format": "ipv4"}', '"127.0.0.1"') | +--------------------------------------------------------+ | 1 | +--------------------------------------------------------+ 1 row in set (0.00 sec)
SELECT JSON_SCHEMA_VALID('{"format": "ipv4"}', '"327.0.0.1"');
+--------------------------------------------------------+ | JSON_SCHEMA_VALID('{"format": "ipv4"}', '"327.0.0.1"') | +--------------------------------------------------------+ | 0 | +--------------------------------------------------------+ 1 row in set (0.00 sec)

enumを使用して、文字列が配列に含まれているかどうかを確認することもできます。

SELECT JSON_SCHEMA_VALID('{"enum": ["TiDB", "MySQL"]}', '"TiDB"');
+------------------------------------------------------------+ | JSON_SCHEMA_VALID('{"enum": ["TiDB", "MySQL"]}', '"TiDB"') | +------------------------------------------------------------+ | 1 | +------------------------------------------------------------+ 1 row in set (0.00 sec)
SELECT JSON_SCHEMA_VALID('{"enum": ["TiDB", "MySQL"]}', '"MySQL"');
+-------------------------------------------------------------+ | JSON_SCHEMA_VALID('{"enum": ["TiDB", "MySQL"]}', '"MySQL"') | +-------------------------------------------------------------+ | 1 | +-------------------------------------------------------------+ 1 row in set (0.00 sec)
SELECT JSON_SCHEMA_VALID('{"enum": ["TiDB", "MySQL"]}', '"SQLite"');
+--------------------------------------------------------------+ | JSON_SCHEMA_VALID('{"enum": ["TiDB", "MySQL"]}', '"SQLite"') | +--------------------------------------------------------------+ | 0 | +--------------------------------------------------------------+ 1 row in set (0.00 sec)

anyOfを使用すると、特定の要件を組み合わせて、いずれかの要件が満たされているかどうかを検証できます。

SELECT JSON_SCHEMA_VALID('{"anyOf": [{"type": "string"},{"type": "integer"}]}', '"TiDB"');
+------------------------------------------------------------------------------------+ | JSON_SCHEMA_VALID('{"anyOf": [{"type": "string"},{"type": "integer"}]}', '"TiDB"') | +------------------------------------------------------------------------------------+ | 1 | +------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
SELECT JSON_SCHEMA_VALID('{"anyOf": [{"type": "string"},{"type": "integer"}]}', '["TiDB", "MySQL"]');
+-----------------------------------------------------------------------------------------------+ | JSON_SCHEMA_VALID('{"anyOf": [{"type": "string"},{"type": "integer"}]}', '["TiDB", "MySQL"]') | +-----------------------------------------------------------------------------------------------+ | 0 | +-----------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
SELECT JSON_SCHEMA_VALID('{"anyOf": [{"type": "string"},{"type": "integer"}]}', '5');
+-------------------------------------------------------------------------------+ | JSON_SCHEMA_VALID('{"anyOf": [{"type": "string"},{"type": "integer"}]}', '5') | +-------------------------------------------------------------------------------+ | 1 | +-------------------------------------------------------------------------------+ 1 row in set (0.00 sec)

MySQLとの互換性

  • JSON_SCHEMA_VALID()で検証するスキーマが無効な場合 (例えば{"type": "sting"} )、MySQL はそれを受け入れるかもしれませんが、TiDB はエラーを返します。 "sting"にはスペルミスがあり、正しくは"string"であるべきであることに注意してください。
  • MySQLは、JSONスキーマ標準の古いドラフト版を使用しています。

関連項目

このページは役に立ちましたか?