web-dev-qa-db-ja.com

MySQLの日時フィールドにNULL値を保存するにはどうすればよいですか?

請求されるまで空白(NULL)にしたい「bill_date」フィールドがあり、その時点で日付が入力されます。

MySQLはdatetimeフィールドのNULL値を好まないことがわかります。あなたの誰もこれを処理する簡単な方法を持っていますか、最小日付を「NULL相当」として使用し、その日付を確認することを余儀なくされていますか?

ありがとう。

追加するために編集:

わかりました。MySQLはNULL値を受け入れますが、PHPを使用してレコードを更新する場合、データベースの更新として受け入れません。

変数名は$bill_dateですが、$bill_dateに値を送信せずにレコードを更新しても変数がNULLのままになりません-このエラーが発生します。

Database query failed: Incorrect datetime value: '' for column 'bill_date' at row 1

このエラーを回避するには、実際にWord NULLを送信するか、更新クエリから完全に除外する必要があると思いますか?私は正しいですか?ありがとう!!!

40
rhodesjason

これは賢明なポイントです。

ヌル日付はゼロ日付ではありません。それらは同じように見えるかもしれませんが、そうではありません。 mysqlでは、nullの日付値はnullです。ゼロの日付値は空の文字列( '')and '0000-00-00 00:00:00'

Null日付では、「... where mydate = ''」は失敗します。
空/ゼロの日付で「... mydate is null」の場合は失敗します。

しかし、ファンキーになりましょう。 mysqlの日付では、空/ゼロの日付は厳密に同じです。

例によって

 select if(myDate is null、 'null'、myDate)myDate from myTable = myDate = ''; 
 select if(myDate is null、 'null'、myDate)mydate from myTableここで、myDate = '0000-00-00 00:00:00' 

両方の出力になります: '0000-00-00 00:00:00'。 myDateを ''または '0000-00-00 00:00:00'で更新しても、両方の選択は同じように機能します。

Phpでは、mysqlのnull日付タイプは標準のmysqlコネクタで尊重され、実際のnull($ var === null、is_null($ var))になります。空の日付は常に「0000-00-00 00:00:00」として表されます。

空の日付のみを使用することを強くお勧めしますOR可能な場合は空の日付のみ。一部のシステムでは、有効なグレゴリオ暦の日付である1970-01-01(linux )または0001-01-01(Oracle)。

空の日付はphp/mysqlの方が簡単です。処理するための「whereフィールドがnull」ではありません。ただし、空のフィールドを表示するには、 ''の「0000-00-00 00:00:00」の日付を「手動で」変換する必要があります。 (保存または検索するために、ゼロ日付を処理する特別なケースはありません。これはニースです).

ヌルの日付にはより注意が必要です。 nullの周りに引用符を追加しないように挿入または更新する場合は注意する必要があります。そうしないと、nullの代わりにゼロの日付が挿入され、標準のデータが混乱します。検索フォームでは、「and mydate is not null」などのケースを処理する必要があります。

通常、NULL日付はより多くの作業です。しかし、それらは非常に多く[〜#〜] much [〜#〜]クエリのゼロ日付よりも高速です。

21
roselan

Windowsでこの問題が発生しました。

これが解決策です。

NULLに ''を渡すには、無効にする必要がありますSTRICT_MODE(Windowsインストールではデフォルトで有効になっています)

ところでNULLに ''を渡すのは面白いです。なぜこのような行動をさせたのかわかりません。

7
abzarak

テーブルの宣言方法によって異なります。 NULLは以下では許可されません。

create table MyTable (col1 datetime NOT NULL);

ただし、次の場合に許可されます。

create table MyTable (col1 datetime NULL);

2番目はデフォルトであるため、誰かが列をnullにできないように積極的に決定している必要があります。

3
Andomar

フィールドのデフォルトがnullの場合、MySQLがnullを取ることを発見しました。特定のifステートメントを記述し、引用符を省略します。これはアップデートでも機能します。

if(empty($odate) AND empty($ddate))
{
  $query2="UPDATE items SET odate=null, ddate=null, istatus='$istatus' WHERE id='$id' ";
};
2
postmarkis

価値があることについて:Perl経由でMySQLテーブルを更新しようとすると、同様の問題が発生していました。空の文字列値(別のプラットフォームからの読み取りのnull値から変換された)が日付列(以下のコードサンプルの「dtcol」)に渡されると、更新は失敗します。更新ステートメントに埋め込まれたIFステートメントを使用して、データを更新することに成功しました。

    ...
    my $stmnt='update tbl set colA=?,dtcol=if(?="",null,?) where colC=?';
    my $status=$dbh->do($stmt,undef,$iref[1],$iref[2],$iref[2],$ref[0]);
    ...
2
Joe M

MySQL v5.0.6でテストしたところ、datetimeカラムは問題なくnullを受け入れました。

2
Rob

具体的には、取得しているエラーに関連して、MySQLのNULL可能フィールドに対してPHPでこのようなことを行うことはできません。

$sql = 'INSERT INTO table (col1, col2) VALUES(' . $col1 . ', ' . null . ')';

PHPのnullは、MysQLのNULL値と同じnotである空の文字列に相当します。

$sql = 'INSERT INTO table (col1, col2) VALUES(' . $col1 . ', ' . (is_null($col2) ? 'NULL' : $col2). ')';

もちろん、is_nullを使用する必要はありませんが、ポイントをもう少し良く示していると思います。 empty()またはそのようなものを使用する方がおそらく安全です。また、$ col2がクエリで二重引用符で囲む文字列である場合は、notが 'NULL'文字列の周りの文字列を含むことを忘れないでください。そうしないと機能しません。

お役に立てば幸いです!

1
Lukey