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を使用した場合に発生することがあります。

関連項目: