はじめに
以前からOracleでは空文字がNULLと判定されています。
他のデータベースとは違う動作となるので、データベース移行の際は問題というか注意点の一つになることが多いです。
とあるサイトで議論した際、最近のマニュアル(19c SQLリファレンスガイド)では以下のような記載があるよ、と教えてもらいました。
ノート:Oracle Databaseは現在、長さが0(ゼロ)の文字値をNULLとして処理します。
ただし、将来のリリースではこの処理が変更される場合があるため、空の文字列をnullと同じように処理しないことをお薦めします。
いつから記載されているのか気になったため、さかのぼってみてみたらだいぶ古くから同じような記載になっていたので、記録しておきます。
なお、最後尾に Oracleの空文字とNULLの挙動についてはOracle Live SQLでの確認結果を載せておいたので気になる方は確認してみてください。
ノート:Oracle Databaseは現在、長さが0(ゼロ)の文字値をNULLとして処理します。
ただし、将来のリリースではこの処理が変更される場合があるため、空の文字列をnullと同じように処理しないことをお薦めします。
注意:
Oracle Databaseは現在、長さが0(ゼロ)の文字値をNULLとして処理します。
ただし、この処理はOracleの今後のバージョンでも継続されるとはかぎらないため、空の文字列をNULLとして処理しないことをお薦めします。
※ Oracle10gの日本語版のSQLリファレンスは見つけられませんでした
現在、Oracle は、長さが 0(ゼロ)の文字値を NULL として処理します。
ただし、この処理は Oracle の今後のバージョンでも継続されるとはかぎらないため、空の文字列を NULL として処理しないことをお薦めします。
(現在、Oracle は、長さが 0(ゼロ)の文字値を NULL として処理します。
ただし、この処理は Oracle の将来のバージョンでも継続されるとは限らないため、空の文字列を NULL として処理しないことをお薦めします。)
-
Oracle7 Server SQL Reference Release 7.3
日本語版のマニュアルは見つけられませんでした。
Oracle7 currently treats a character value with a length of zero as null.
However, this may not continue to be true in future versions of Oracle7.
まとめ
少なくともOracle7の時代から、他のデータベースとは違う挙動となっており、注意が必要、という喚起はされていました。
現時点でも挙動が変わっていないということは、きっと永遠に変わらないのでしょう。
Oracle6やそれ以前のマニュアルの記載をご存じの方がいらっしゃったら是非お知らせください。
Oracleにおける空文字とNULLの扱い
その前に、空文字とNULLについて、改めて振り返っておきます。
Oracle Live SQL で実行可能です。
テストテーブルを作成し、'' 空文字 と NULL を挿入します。
テストテーブル作成とテストデータ挿入
drop table test01;
create table test01(
id number primary key,
testc char(8),testnc nchar(8),testvc varchar2(8),testnvc nvarchar2(8));
insert into test01 values (1,'','','','');
insert into test01 values (2,null,null,null,null);
commit;
テーブルの中身を見てみると、NULLとして挿入されていることがわかります。
select * from test01;
ID | TESTC | TESTNC | TESTVC | TESTNVC |
---|---|---|---|---|
1 | - | - | - | - |
2 | - | - | - | - |
DUMPコマンドでも確認しておきます。
select id,dump(testc, 16),dump(testnc, 16),dump(testvc, 16),ump(testnvc, 16) from test01;
ID | DUMP(TESTC,16) | DUMP(TESTNC,16) | DUMP(TESTVC,16) | DUMP(TESTNVC,16) |
---|---|---|---|---|
1 | NULL | NULL | NULL | NULL |
2 | NULL | NULL | NULL | NULL |
以下のSQLはいずれも同じ結果で、両方の行が出力されます。
select * from test01 where testc is null;
select * from test01 where testnc is null;
select * from test01 where testvc is null;
select * from test01 where testnvc is null;
ID | TESTC | TESTNC | TESTVC | TESTNVC |
---|---|---|---|---|
1 | - | - | - | - |
2 | - | - | - | - |
こちらはいずれもデータが出力されません。
select * from test01 where testc = '';
select * from test01 where testnc = '';
select * from test01 where testvc = '';
select * from test01 where testnvc = '';
no data found
また、NOT NULL制約を付した行には空文字を挿入することはできません。
truncate table test01;
ALTER TABLE test01 MODIFY (testc NOT NULL);
insert into test01 values (1,'','','','');
ORA-01400: cannot insert NULL into ("SQL_XXXXXXXXXXXXXXXX"."TEST01"."TESTC")
ORA-06512: at "SYS.DBMS_SQL", line 1721