概要
Oracle SQL*Loader にてバイト区切り(position 利用時)において、末尾の全角スペースが含まれている場合には全角スペースもTRIM されるようです。
以下がソースファイルと SQL*Loader の実験後のテーブルの出力結果ですが、全角スペース(□
)が消えていることが確認できます。
< ソースファイル >
< Oracle Databaseのテーブルのデータ >
全角スペースが含まれているかを確認するクエリを実行しましたが、含まれていないことが確認できました。
has_fullwidth_space 列では次のような処理をしています。
このSQLクエリは、space_testテーブルからIDとNAMEを選択し、さらにNAMEカラムに全角スペースが含まれているかどうかを判定しています。
CASE WHEN instr(NAME, ' ') > 0 THEN 'Yes' ELSE 'No' END AS has_fullwidth_spaceの部分がその判定を行っています。
instr(NAME, ' ')は、NAMEカラムの値に全角スペースが含まれている位置を返します。全角スペースが含まれていない場合、この関数は0を返します。
したがって、instr(NAME, ' ') > 0は、NAMEカラムの値に全角スペースが含まれている場合に真(true)を返します。
CASE WHEN句は、その条件が真である場合(つまり、NAMEカラムに全角スペースが含まれている場合)に'Yes'を返し、偽である場合(つまり、NAMEカラムに全角スペースが含まれていない場合)に'No'を返します。
この結果は、has_fullwidth_spaceという名前の新しいカラムとして出力されます。
Oracle Database の文字コードは、JA16SJISTILDE
で検証しています。
以上の結果から、Oracle SQL*Loader にてバイト区切り(position 利用時)において、末尾の全角スペースが TRIM されると解釈しました。
検証手順
1. データファイルの準備
次のデータをもつファイルを、/home/oracle/char_test/text.txt
に作成
1 ABC
2 あいう
3 abc
2. 制御ファイルの準備
SQL*Loader の制御ファイルを、/home/oracle/char_test/test.ctl
に作成
-- char_test/test.ctl
LOAD DATA
CHARACTERSET JA16SJIS
INFILE '/home/oracle/char_test/text.txt'
TRUNCATE
INTO TABLE space_test
FIELDS TERMINATED BY ','
(
ID position(1:2) CHAR,
NAME position(3:12) CHAR
)
3. テーブルの作成
/*
DROP TABLE space_test;
*/
CREATE TABLE space_test (
id CHAR(2),
name CHAR(10)
)
;
4. SQL*Loader の実行
sqlldr username/password@database control=char_test/test.ctl log=char_test/test.log
5. 実行結果を確認
SELECT
ID,
NAME,
CASE WHEN instr(NAME, ' ') > 0
THEN 'Yes'
ELSE 'No'
END AS has_fullwidth_space
FROM space_test
;
ID | NAME | has_fullwidth_space |
---|---|---|
1 | ABC | No |
2 | あいう | No |
3 | abc | No |