😱

Oracle ''はNULLで ' 'は空文字なん?!

2024/12/04に公開

はじめに

RDMSユーザーの皆さんこんにちは。

今回はSQLServerとOracleの違いに驚いて仕事中に声が出てしまった私が
SQLServerとOracleの違いについてまとめます。

対象読者

  • Oracleユーザー
  • SQLServerユーザー
  • 複数のDBを同時に使っている方

結論

Oracle
INSERT INTO ATable(
    AColumn
    , BColumn
)
VALUES (
    ''    --NULLが入る。
    , ' ' --空文字が入る。
)
SQLServer
INSERT INTO ATable(
    AColumn
    , BColumn
    , CColumn
)
VALUES (
    ''     --空文字が入る。
    , ' '  --空文字が入る。
    , NULL --NULLが入る。
)

本文

Oracleとの出会い

あれは今年の9月の事でした。20年以上前のシステムをマイグレーションするプロジェクトに
アサインされました。そのプロジェクトではデータベースはOracleを使用していました。
 最初はサクサク修正が進みましたが、クエリの修正で手が止まります。
空文字が挿入されるようにクエリを書いているにもかかわらず、NULLが挿入されてしまうのです。

調べてみたら

早速疑問をAI君に聞いてみました。するとAI君は「Oracleでは''はNULL判定だよ!」と
仰るのです。まさかと思って公式ドキュメントを見に行くと以下のような文言が。

Oracle Databaseは、長さが0(ゼロ)の文字値をNULLとして処理します。

衝撃でした。思わず声が出ました。仕事中にもかかわらず。
これはOracle独自の仕様らしい。

また、公式ドキュメントに以下のような文言もありました。

ノート:Oracle Databaseは現在、長さが0(ゼロ)の文字値をNULLとして処理します。ただし、将来のリリースではこの処理が変更される場合があるため、空の文字列をnullと同じように処理しないことをお薦めします。

いつか他のDBと同じになるかと思いきやどうもOracle7(初版リリース1992年)の頃から
この文言は書かれているらしい。

まとめ

  • DBそれぞれにそれぞれの仕様がある場合がある。
  • みんな違ってみんな良くない場合もある。

参考文献

https://qiita.com/asahide/items/1e89982bc20301fd7d90
https://docs.oracle.com/cd/F19136_01/sqlrf/Nulls.html#GUID-B0BA4751-9D88-426A-84AD-BCDBD5584071

Discussion