6 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エンコーディングを使用している場合にも当てはまります。

たとえば、ファンクションjson_queryを使用してBLOB入力からJSONデータを抽出し、BLOBとして結果を戻す場合は、AL32UTF8を使用して戻されます。

SQL/JSONファンクションまたはPL/SQLメソッドのアプリケーションでVARCHAR2またはCLOBの戻りデータ型を指定し、およびデータベース・キャラクタ・セットがAL32UTF8でない場合に、キャラクタ・セットの変換で情報の損失が発生することがあります。最終的にBLOBまたはJSON型として作成されている場合でも、入力JSONデータがBLOBまたはBLOB型インスタンスに格納された場合、一部がVARCHAR2またはCLOBに一時的に変更されると、変換後のBLOBデータで情報が損失する可能性があります。これは、たとえばjson_serializeを使用した場合に発生することがあります。

関連項目: