2010年1月5日火曜日

SQLでの空白をどうしよう?

SQL文をPHPで生成させる場合、空白のデータをどう扱うか悩んでいます。ウェブフォームでテキスト(form_text)や日付(form_date)という入力があったとして、何も入れていない場合です。ここから次のようなSQLを作成すると、
UPDATE table SET form_text='', form_date='';
日付は空白設定できないといって怒られるはずです。

じゃぁ
UPDATE table SET form_text=NULL, form_date=NULL;
とするのもいかがなものかと。

人間様にはNULLも’’も区別が無いなのですが、データベースに渡す際には区別しなくてはいけないのが問題なのでしょう。ここは汎用SQLルーチンを書く際に面倒な部分と思います。今はDefaultに設定してしまえ、と思ってはいるのですが・・・要は、
UPDATE table SET form_text=DEFAULT, form_date=DEFAULT;
とするだけなのですが。

◆データベースでのデフォルトの扱いについて読んでみた。

MySQL:

デフォルト値は数値型では 0 であり、文字列型では空の文字列('')であり、日付と時刻型では ``ゼロ'' 値です。

MySQLの日付で「ゼロ値」って?
ODBC では、日付または時刻型の値 ``ゼロ'' を処理できないため、MyODBC バージョン 2.50.12 以降では、MyODBC を通して日付または時刻型の値 ``ゼロ'' を使用すると、自動的に NULL に変換される。


PostgreSQL:
明示的に宣言されたデフォルト値がない場合は、デフォルト値はNULL値になります。NULL値は不明のデータを表すものとみなすことができるので、通常はこの方法で問題ありません。

何のデータベースを使っていて、どう設定されてるかによって挙動が変わるということになりそうです。まぁデータベースを作成した人に責任を取ってもらおう、ということですね。←それって自分かも・・・

◆アプリ(PHP)側で設定をする

本来はこの対応が正しいかもしれないですね。特にフォームの入力といった場合は、アプリ側でデフォルトを設定することは可能です。一方、データベース上にデフォルトが設定されているならば、それにあわせるべき、という考え方もあると思うので、難しいところです。

どちらにしても、データベース上のテーブルから別のテーブルへデータをコピーする場合などで、Default値が違ったりすると扱いが難しくなるんじゃないでしょうか。

0 件のコメント: