SQL*Loaderで複数の文字コードが混ざったデータをロードする
SQL*Loaderで複数の文字コードが混ざったデータをロードする
概要
単一のテキストファイル内で特定のカラムのみ文字コードが違うファイルをSQL*Loaderでデータベースに取り込む方法
注意
本記事で扱っている対処方法はおそらく紛れ込んだ文字コードが
本来あるべき文字コードの一部として解釈できない場合使用できないと思います。(未検証)
最低限文字化けしながらも読み込める状態を想定しています。
結論
コントロールファイル内で文字コードの変換が必要なカラムに以下の関数を適用する。
column "CONVERT(:column, 'target_charset', 'src_charset'),"
経緯
先日仕事でAdobe Analyticsから出力されたデータを扱う機会がありました。
該当のデータは基本的にISO8759-1で出力されるようなのですが、一部カラム(evar1-evar255)はユーザー側で
設定するデータのためISO8859-1の文字コードでない場合があるそうです。
読み込み方法
Oracle DatabaseのSQL*LoaderにはもともとデータベースのCHARCTERSET
とファイルのエンコーディングが
異なっている場合、ファイルを読み込むときのSQL*Loaderのコントロールファイル内で
CHARACTERSET
を指定することで変換をすることができます。[1]
しかしCHARACTERSET
を指定する方法は単一文字コードで構成されていることを前提としているため、
複数の文字コードが混在したケースを処理することはできません。
そこでSQL*LoaderのSQL演算子をフィールドへ適用する機能を用いることで回避ができます。
Oracle Databaseにはconvert
という任意の文字コードから他の文字コードに変換する機能が提供されているため、
対象となるフィールドにconvert
を適用することで無理やりファイルの文字コードを統一することが可能です。
column "CONVERT(:column, 'target_charset', 'src_charset'),"
まとめ
ファイル内の文字コードは統一しよう。
各種プログラミング言語で読み込みするときって対処法あるんですか?
参考
- Adobe Analyticsデータフィードの内容 - 概要
- Adobe Analyticsデータ列リファレンス
- SQL*Loader制御ファイル・リファレンス 入力文字の変換
- SQL*Loader制御ファイル・リファレンス フィールドへのSQL演算子の適用
-
今回の解決方法が使えることから考えるにDBへのロード時に変換が行われているように見える ↩︎
Discussion