🎉

SQL*Loaderで複数の文字コードが混ざったデータをロードする

2022/09/25に公開

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'),"

まとめ

ファイル内の文字コードは統一しよう。
各種プログラミング言語で読み込みするときって対処法あるんですか?

参考

脚注
  1. 今回の解決方法が使えることから考えるにDBへのロード時に変換が行われているように見える ↩︎

GitHubで編集を提案

Discussion