6 JSONデータの文字セットおよび文字エンコーディング

JSONデータでは常にUnicode文字セットが使用されます。この点で、JSONデータの方がXMLデータより簡単に使用できます。これは、JSONデータ交換フォーマットの重要な部分です(RFC 4627)。Oracle Databaseで処理されるJSONデータでは、必要な文字セットの変換が自動的に行われます。

Oracle Databaseでは、JSONデータの処理時にUTF-8を内部で使用します(解析、問合せ)。このような処理に入力されるデータまたはこのような処理から出力されるデータをUTF-8とは異なる文字セットにする必要がある場合は、それに応じた文字セット変換が実行されます。

文字セット変換はパフォーマンスに影響する可能性があります。また、情報が失われる可能性もあります。入力データをUTF-8に変換する操作では情報が失われる可能性は高くありませんが、出力文字セットで表すことができない文字の場合、出力への変換の結果として情報の損失が発生する可能性があります。

JSONデータがUnicodeのようにデータベースに格納されている場合、格納または取得時に文字セットの変換は必要ありません。これは、データベースの文字セットがAL32UTF8 (Unicode UTF-8)である場合、またはJSONデータが文字セットAL16UTF16を含むCLOBインスタンス内に格納されている場合です。可能であれば、データベース文字セットとしてAL32UTF8を使用することをお薦めします。

データベース文字セットに関係なく、データ型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の戻りデータ型を指定し、およびデータベース文字セットがUnicodeでないる場合に、文字セットの変換で情報の損失が発生することがあります。最終的にBLOBとして作成されている場合でも、入力JSONデータがBLOBインスタンスに格納された場合、一部がVARCHAR2またはCLOBに一時的に変更されると、変換後のBLOBデータに情報が損失する可能性があります。

関連項目: