事象
オンプレミスの本番環境Oracle DBからRDS for OralceにData Pumpを用いたデータ移行リハーサルを実施していました。
dmpファイルをRDSにダウンロードし、スキーマをインポートしている時、インポートログに下記のようなメッセージが表示されました。
JA16SJISTILDE文字セットおよびAL16UTF16 NCHAR文字セットでインポートを実行します
JA16SJISTILDE文字セットおよびUTF8 NCHAR文字セットでエクスポートを実行します
警告: 文字セット変換でデータが失われた可能性があります
どうやら文字コードの変換に関して問題が生じたようです。
原因
オンプレミスDBとRDSで各国語キャラクタセットの文字コード指定が異なっていました。
下記のSQLを実行して確認しました。
select * from NLS_DATABASE_PARAMETERS
where parameter = 'NLS_NCHAR_CHARACTERSET'
その結果、オンプレミスDBにはUTF8が、RDSにはAL16UTF16が設定されており、上記メッセージの原因になっていることが分かりました。
Oracle公式に記載されている各国語キャラクタセットが影響するデータ型はNCHARとNVARCHAR2であるという事実から、テーブルにそれらのデータ型がなければ特に影響はないようです。
感想
警告がデータ不整合を連想させるものだったので大変びっくりし、全件テーブル比較して差異を探す必要があるのかと不安になっておりましたが、NCHARとNVARCHAR2は使用していなかったので安心しました。データベースキャラクタセットだけでなく、各国語キャラクタセットも影響するのだなと勉強になりました。