🐾
SQL*Loaderの文字化けで悩んだ話
はじめに
Windowsサーバーで制御ファイル(.ctl)を実行した際に、文字化けで悩まされた話をします。
前提
- 制御ファイル、取り込みたいCSVデータを用意
- sqlldrコマンドを実行(SQL*Loaderで制御ファイルを読み取る)
- 制御ファイルの冒頭
発生した事象
- sqlldrコマンドを実行した際に下記のエラーが発生。
SQL*Loader-350: 行1に構文エラーがあります。 英数字以外の無効な文字列があります。
・ソ--***
1行目--***
がソ--***
になっている・・? 「ソ」
って何・・?
対応方法
制御ファイルを文字コード「UTF-8」で保存していたため、「SJIS」へ変更。
原因
文字コード「UTF-8」で保存したテキストファイルを文字コード「Shift-JIS」で開くと、何もないはずの場所に半角カタカナの「ソ」が現れます。
これはUTF-8+BOM付きで保存した際に「バイトオーダーマーク (byte order mark)」:通称BOM(ボム)コードの3文字が先頭に追加されるためです。
-
メモ帳で制御ファイルを作成しており、文字コード「UTF-8」で保存していたが、代表的なテキストエディタでは「UTF-8」を選択していると自動的にBOMを付けてくれることがあり、UTF-8+BOM付きになっていた。
-
Windows 10/11上のコマンドプロンプトやWindowsターミナルは、文字コードとしてShift-JIS(シフトJIS)がデフォルトのため、「UTF-8」で保存したファイルを文字コード「Shift-JIS」で開こうとした。
1.の確認として、ローカルPCで「UTF-8」で保存した制御ファイルをSQL*Loaderの実行環境へ持っていき、その後またローカルPCへ同ファイルをコピーして文字コードを確認すると「UTF-8」→「UTF-8 BOM付」に変身していました。
参考
制御ファイルの文字コード
- 制御ファイルの文字コードは環境(NLS_LANGで指定された文字コード)に合わせる。
私の実行環境では設定されていませんでしたが、環境に合わせて上記の対応方法が変わるかと思います。
現在のNLS_LANG設定の確認
取り込むデータの文字コード
- 取り込むデータでも文字化けが発生しないよう文字エンコードを指定する。
LOAD DATA CHARACTERSET <エンコード名>
取込ファイルの文字エンコードを指定する
最後に
文字化けに久々に悩まされたので備忘録として記載しました。
どなたかの参考になれば幸いです。
以上、えみり〜でした|ωΦ)ฅ
Discussion