8 JSONデータの文字セットおよび文字エンコーディング
JSONデータでは常にUnicode文字セットが使用されます。この点で、JSONデータの方がXMLデータより簡単に使用できます。これは、JSONデータ交換フォーマットの重要な部分です(RFC 8259)。Oracle Databaseで処理されるJSONデータでは、必要な文字セットの変換が自動的に行われます。
Oracle Databaseでは、JSONデータの処理時(解析、問合せ)に内部で文字セットUTF-8が使用されます。このような処理に入力されるデータまたはこのような処理から出力されるデータをUTF-8とは異なる文字セットにする必要がある場合は、それに応じた文字セット変換が実行されます。
文字セット変換はパフォーマンスに影響する可能性があります。また、情報が失われる可能性もあります。入力データをUTF-8に変換する操作では情報が失われる可能性は高くありませんが、出力文字セットで表すことができない文字の場合、出力への変換の結果として情報の損失が発生する可能性があります。
JSONデータがUnicodeとしてデータベースに格納されている場合、格納または取得時に文字セットの変換は必要ありません。これは次のいずれかの条件が当てはまる場合です。
-
JSONデータは、
JSON
型またはBLOB
インスタンスとして格納される。 -
データベース文字セットがAL32UTF8 (Unicode UTF-8)である。
-
JSONデータは、文字セットがAL16UTF16の
CLOB
インスタンスとして格納される。
JSON
データ型を使用してJSONデータを格納し、可能な場合はデータベース文字セットとしてAL32UTF8を使用することをお薦めします。
データベース文字セットに関係なく、データ型JSON
またはBLOB
を使用して格納されているJSONデータでは、格納または取得時に文字セットの変換はありません。JSONデータは、AL32UTF8、AL16UTF16またはAL16UTF16LEとしてデータ型BLOB
を使用して格納できます。
SQL/JSONファンクションまたはPL/SQLメソッドを使用してJSONデータを変換し、データ型BLOB
を使用して変換の結果を戻す場合、結果はAL32UTF8としてエンコードされます。これは、入力BLOB
データは別のUnicodeエンコーディングを使用している場合にも当てはまります。
たとえば、SQL/JSONファンクションjson_query
を使用してBLOB
入力からJSONデータを抽出し、BLOB
として結果を戻す場合、それはAL32UTF8を使用して戻されます。
SQL/JSONファンクションまたはPL/SQLメソッドのアプリケーションでVARCHAR2
またはCLOB
の戻りデータ型を指定し、データベース文字セットがAL32UTF8でない場合は、文字セットの変換で情報の損失が発生する可能性があります。最終的にBLOB
またはJSON
型として作成されている場合でも、入力JSONデータがBLOB
またはBLOB
型インスタンスに格納された場合、一部がVARCHAR2
またはCLOB
に一時的に変更されると、変換後のBLOB
データで情報が損失する可能性があります。これは、たとえばSQL/JSONファンクションjson_serialize
を使用した場合に発生することがあります。
関連項目:
-
Unicodeの詳細は、Unicode.orgを参照してください
-
JSONデータ交換フォーマットの定義は、ECMA404およびIETF RFC 8259のサイトを参照してください
-
ECMAScript言語仕様(JavaScript)の場合は、ECMA 262およびECMA 262第5.1版
-
データベースでの様々な文字セットの使用の詳細は、Oracle Database Migration Assistant for Unicodeユーザーズ・ガイドを参照してください。
-
データベースでの文字セット変換の詳細は、Oracle Databaseグローバリゼーション・サポート・ガイドを参照してください。
親トピック: JSONデータの格納および管理