MySQL datetime alanlarda NULL değerleri depolamak nasıl?

7 Cevap php

Ben tarih girilecektir hangi noktada, fatura edilmiştir olana kadar I (NULL) boş olmasını istiyorum "bill_date" alanı var.

Ben MySQL datetime alanlarda NULL değerleri sevmez görüyoruz. İçinizde bu işlemek için basit bir yol var mı, yoksa bir "NULL eşdeğer" olarak min tarihi kullanmak ve o tarih için kontrol etmek zorunda kalıyorum?

Teşekkürler.

EDITED TO ADD:

Tamam ben MySQL NULL değerini kabul edeceğini görüyorum, ama ben PHP kullanarak kayıt güncelleme kulüpler eğer bir veritabanı güncellemesi olarak kabul etmeyecektir.

Değişken adı $bill_date ama ben $bill_date bir değer göndermeden bir kaydı güncellemek eğer NULL gibi değişken bırakmak olmaz - Ben bu hatayı alıyorum:

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

Ben aslında kelime NULL göndermek, ya da bu hatayı önlemek için, tamamen güncelleştirme sorgusu dışında bırakmak gerekir varsayıyorum? Haklı mıyım? Teşekkürler!

7 Cevap

MySQL does datetime alanlar için NULL değerleri sağlar. Ben sadece test:

mysql> create table datetimetest (testcolumn datetime null default null);
Query OK, 0 rows affected (0.10 sec)

mysql> insert into datetimetest (testcolumn) values (null);
Query OK, 1 row affected (0.00 sec)

mysql> select * from datetimetest;
+------------+
| testcolumn |
+------------+
| NULL       | 
+------------+
1 row in set (0.00 sec)

Ben bu sürümü kullanıyorum:

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.0.45    | 
+-----------+
1 row in set (0.03 sec)

EDIT # 1: Ben PHP alıyorsanız hata iletisi boş bir dize geçirmeden olduğunu gösterir düzenlemeden görmek (yani ''), değil null. Boş bir dize null farklı olduğunu ve bu hata mesajını alıyorsanız neden geçerli bir datetime değer değildir. Kastettiğin buysa size özel sql anahtar null geçmelidir. Ayrıca, kelimenin null etrafında herhangi bir tırnak koymayın. null eklemek için nasıl bir örnek benim için yukarıdaki insert bildirimine bakın.

EDIT # 2: PDO kullanıyor musunuz? Eğer öyleyse, size boş param bağladığınızda, bir null bağlama zaman [PDO::PARAM_NULL][1] türünü kullandığınızdan emin olun. Düzgün null PDO kullanarak eklemek için nasıl answer to this stackoverflow question bakın.

Bu mantıklı bir noktadır.

Bir null tarih sıfır tarih değildir. Onlar aynı görünebilir, ama onlar değil. MySQL, boş bir tarih değeri null. Sıfır tarih değeri and '0000-00-00 00:00:00 '('') boş bir dizedir

On a null date "... where mydate = ''" will fail.
On an empty/zero date "... where mydate is null" will fail.

Ama şimdi korkak başlayalım. Mysql tarihleri, boş / sıfır tarih kesinlikle aynıdır.

örnek

select if(myDate is null, 'null', myDate) as mydate from myTable where  myDate = '';
select if(myDate is null, 'null', myDate) as mydate from myTable where  myDate = '0000-00-00 00:00:00'

olacaktır İKİ çıktı: '0000-00-00 00:00:00 '. ile'' veya '0000-00-00 00:00:00 'sen MyDate güncelleme yaparsanız, hem seçer yine aynı şekilde çalışacaktır.

Php, mysql boş tarihleri ​​tip standart mysql konektörü ile saygı ve gerçek nulls ($ var === null, is_null ($ var)) olacaktır olacaktır. Boş tarih her zaman '0000-00-00 00:00:00 'olarak temsil edilecek.

Ben kuvvetle sadece boş tarihleri, OR sadece boş tarihleri ​​eğer kullanmanızı tavsiye ederiz. (Bazı sistemler 1970-01-01 (linux) veya 0001-01-01 (oracle) gibi, geçerli Gregoryen tarihleri ​​"virual" sıfır tarihleri ​​kullanacaktır.

Boş tarihleri ​​PHP / MySQL kolaydır. Siz "alanı boş olduğu" işlemek zorunda değilsiniz. Ancak, "elle" boş alanları görüntülemek için'' olarak '0000-00-00 00:00:00 'tarih dönüştürmek zorunda. (Seni saklamak veya arama güzel sıfır tarihleri, işlemek için özel bir durum yok).

Boş tarihleri ​​daha iyi bakım gerekir. Eğer sıfır tarih, standart veri hasara neden olan, yerine null eklenecek başka, boş tırnak eklemek DEĞİL eklemek veya güncelleştirmek dikkatli olmak zorunda. Arama formları, sizin gibi davalarını gerekir "ve mydate boş değil" böylece, ve.

Boş tarihler genellikle fazla iş vardır. ama onlar çok KADAR sorguları için sıfır tarihlerini daha MUCH daha hızlı.

Ben sadece MySQL v5.0.6 test ve datetime sütun sorunu olmadan boş kalabilir.

Bu sizin masa beyan nasıl bağlıdır. NULL izin verilmez:

create table MyTable (col1 datetime NOT NULL);

Ama izin olurdu:

create table MyTable (col1 datetime NULL);

İkinci yüzden birisi aktif sütun null olmamalı karar olmalı, varsayılan.

Perl aracılığıyla MySQL tablosunu güncelleştirmek için çalışırken benzer bir sorunu yaşıyorsanız edilmiştir: ne değer için. (Başka bir platformda bir okuma bir boş değer tercüme) boş bir dize değeri tarih sütununda (aşağıdaki kod örneğinde 'dtcol') geçirilen zaman güncelleştirme başarısız olur. Ben güncelleme açıklamada gömülü bir IF deyimi kullanarak güncellenen veri alma nihayet başarılı oldu:

    ...
    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]);
    ...

Özellikle alıyoruz hata ile ilgili, size MySQL null bir alan için PHP böyle bir şey yapamaz:

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

PHP boş MySQL bir NULL değer olarak aynı not boş bir dizeye eşit olacaktır çünkü. Bunun yerine bunu yapmak istiyorum:

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

Tabii ki is_null kullanmak zorunda değilsiniz ama ben biraz daha iyi noktasını gösteriyor bu rakam. Muhtemelen daha güvenli boş () ya da buna benzer bir şey kullanmak için. Ve $ col2 sen, sorguda çift tırnak içine alın olacağını aksi takdirde bu alışkanlık iş, not 'null' dize etrafında olanlara eklemeyi unutmayın bir dize olmak olur.

Umarım ki olur!

Ben windows bu sorunu vardı.

Bu çözüm:

(Windows yüklemeleri varsayılan olarak etkin olduğu) STRICT_MODE devre dışı bırakmanız gerekir NULL'' geçmek

MEZUNLARI Bu NULL'' geçmek komik. Onlar bu tür davranışları neden izin bilmiyorum.