🐲

SQL*Loaderの文字化けで悩んだ話

2024/01/26に公開

はじめに

Windowsサーバーで制御ファイル(.ctl)を実行した際に、文字化けで悩まされた話をします。

前提

  1. 制御ファイル、取り込みたいCSVデータを用意
  2. sqlldrコマンドを実行(SQL*Loaderで制御ファイルを読み取る)
  • 制御ファイルの冒頭

発生した事象

  • sqlldrコマンドを実行した際に下記のエラーが発生。
    SQL*Loader-350: 行1に構文エラーがあります。 英数字以外の無効な文字列があります。
    ・ソ--***

1行目--***ソ--***になっている・・? 「ソ」って何・・?

対応方法

制御ファイルを文字コード「UTF-8」で保存していたため、「SJIS」へ変更。

原因

文字コード「UTF-8」で保存したテキストファイルを文字コード「Shift-JIS」で開くと、何もないはずの場所に半角カタカナの「ソ」が現れます。
これはUTF-8+BOM付きで保存した際に「バイトオーダーマーク (byte order mark)」:通称BOM(ボム)コードの3文字が先頭に追加されるためです。

https://qiita.com/yaju/items/0fa8ad605f0fe4f9ead6

  1. Windows 10/11上のコマンドプロンプトやWindowsターミナルは、文字コードとしてShift-JIS(シフトJIS)がデフォルトのため、「UTF-8」で保存したファイルを文字コード「Shift-JIS」で開こうとした。

  2. 制御ファイルを文字コード「UTF-8」で保存していたが、メモ帳などの代表的なテキストエディタでは、UTF-8を選択した場合に自動的にBOMを付けてくれることがあり、UTF-8+BOM付きになっていた。

2.の確認として、ローカルPCで「UTF-8」で保存した制御ファイルをSQL*Loaderの実行環境へ持っていき、その後またローカルPCへ同ファイルをコピーして文字コードを確認すると「UTF-8」→「UTF-8 BOM付」に変身していました。

参考

制御ファイルの文字コード
  • 制御ファイルの文字コードは環境(NLS_LANGで指定された文字コード)に合わせる。
    私の実行環境では設定されていませんでしたが、環境に合わせて上記の対応方法が変わるかと思います。
    現在のNLS_LANG設定の確認
取り込むデータの文字コード

最後に

文字化けに久々に悩まされたので備忘録として記載しました。
どなたかの参考になれば幸いです。

以上、えみり〜でした|ωΦ)ฅ

参考サイト

Discussion