2009-11-06 15 views
29

Ich habe ein "bill_date" Feld, das ich leer sein möchte (NULL), bis es in Rechnung gestellt wird, an welchem ​​Punkt das Datum eingegeben wird.Wie speichert man NULL-Werte in Datetime-Feldern in MySQL?

Ich sehe, dass MySQL nicht NULL-Werte in Datetime-Felder mag. Hat jemand von euch eine einfache Möglichkeit, damit umzugehen, oder muss ich das Min-Date als "NULL-Äquivalent" verwenden und dann nach diesem Datum suchen?

Danke.

Edited hinzufügen:

Ok ich sehe, dass MySQL den NULL-Wert annehmen wird, aber es wird es als eine Datenbank-Update nicht akzeptieren, wenn ich die Platte bin Aktualisierung PHP.

Der Variablenname $bill_date ist, aber es wird die Variable als NULL nicht verlassen, wenn ich einen Datensatz aktualisieren, ohne einen Wert $bill_date zu Senden - ich bekomme diese Fehlermeldung:

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

Ich nehme an, ich muss eigentlich Senden Sie das Wort NULL, oder lassen Sie es aus der Update-Abfrage insgesamt, um diesen Fehler zu vermeiden? Habe ich recht? Vielen Dank!!!

+0

MySQL DOES NULL-Werte für die Datetime-Definition akzeptieren, aber wenn Sie aus irgendeinem Grund anders denken und nicht einen Nullwert, betrachten verwenden Sie einfach ‚1000.01.01‘ als Wert Verwendung findet und Zeilen, die Haben Sie diesen Wert für Ihre Rechnungsdatumsspalte in Ihren Abfragen. – BraedenP

+0

Mysql erlaubt Nullen in Datetime-Feldern. Ich vermute, dass das Problem von der Art, wie Sie auf MySQL zugreifen, herrührt. Können Sie Ihre Frage mit dem Mechanismus bearbeiten, mit dem Sie auf die Daten zugreifen? Verwenden Sie beispielsweise meine ODBC, eine Perl-Bibliothek usw.? – anschauung

+0

Verwenden von PHP - siehe meine Änderungen oben. – rhodesjason

Antwort

42

MySQL funktioniert erlauben NULL Werte für datetime Felder. Getestet habe ich es nur:

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) 

Ich verwende diese Version:

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

EDIT # 1: Ich sehe in Ihrem bearbeiten, dass die Fehlermeldung, die Sie in PHP bekommen zeigt an, dass Sie eine sind vorbei leere Zeichenfolge (zB ''), nicht null. Eine leere Zeichenfolge unterscheidet sich von null und ist kein gültiger datetime Wert, weshalb Sie diese Fehlermeldung erhalten. Sie müssen das spezielle sql Schlüsselwort null übergeben, wenn Sie das meinen. Setzen Sie auch keine Anführungszeichen um das Wort null. Siehe meine insert Erklärung oben für ein Beispiel, wie man null einfügt.

EDIT # 2: Verwenden Sie PDO? Wenn dies der Fall ist, stellen Sie beim Binden des Null-Parameters sicher, dass Sie den Typ [PDO::PARAM_NULL][1] verwenden, wenn Sie eine null binden. Siehe answer to this stackoverflow question, wie man null mit PDO richtig einfügt.

+0

Verwenden von PHP - siehe meine Änderungen im ursprünglichen Beitrag oben. – rhodesjason

+0

@Jason Rhodes: Ok, ich habe meine Antwort aktualisiert, um Ihre Änderungen zu bearbeiten. Wenn es immer noch nicht funktioniert, poste bitte deinen PHP-Code. – Asaph

+0

@Jason Rhodes: Ich habe einige Hinweise, die hilfreich sein könnten, wenn Sie PDO verwenden. – Asaph

2

Ich habe gerade in MySQL v5.0.6 getestet und die Datetime-Spalte akzeptiert null ohne Problem.

3

Es hängt davon ab, wie Sie Ihre Tabelle deklarieren. NULL nicht in erlaubt sein:

create table MyTable (col1 datetime NOT NULL); 

Aber es wäre in erlaubt sein:

create table MyTable (col1 datetime NULL); 

Die zweite ist die Standardeinstellung, so jemand must've aktiv entschieden, dass die Spalte keine Nullwerte enthalten sein sollte.

18

Dies ist ein sinnvoller Punkt.

Ein Nulldatum ist kein Nulldatum. Sie mögen gleich aussehen, sind es aber nicht. In mysql ist ein Nulldatumswert null.Ein Nulldatum ist eine leere Zeichenfolge ('') und '00:00:00'

Auf ein Nulldatum "... wo Mydate = ''" wird fehlschlagen.
Auf einem leeren/Null-Datum "... wo Mydate ist Null" wird fehlschlagen.

Aber jetzt lasst uns funky werden. In Mysql-Daten sind leere/Null-Datum genau die gleichen.

mit gutem Beispiel

 
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' 

wird beiden Ausgänge: '0000-00-00 00.00.00'. Wenn Sie myDate mit '' oder '0000-00-00 00:00:00' aktualisieren, funktionieren beide Selektionen immer noch gleich.

In PHP wird der mysql Null-Datumstyp mit dem Standard-mysql-Konnektor respektiert und ist echte Nullen ($ var === null, is_null ($ var)). Leere Daten werden immer als '0000-00-00 00:00:00' dargestellt.

Ich rate dringend, nur Null Daten oder nur leere Daten zu verwenden, wenn Sie können. (Einige Systeme verwenden "virual" Nulldaten, die gültige Gregorianische Daten sind, wie 1970-01-01 (linux) oder 0001-01-01 (oracle).

leere Daten sind einfacher in php/mysql. Sie don Sie müssen das "where-Feld ist null" nicht verarbeiten. Sie müssen jedoch das Datum "0000-00-00 00:00:00" in "" manuell umwandeln, um leere Felder anzuzeigen. (um Sie zu speichern oder zu durchsuchen habe keinen speziellen Fall für null Daten, was ist nett)

Null Daten müssen besser Pflege.Sie müssen vorsichtig sein, wenn Sie einfügen oder aktualisieren, um keine Anführungszeichen rund um Null, sonst wird ein Null-Datum sein anstelle von null eingefügt, was Ihre Standard-Datenverwüstung verursacht. In Suchformularen müssen Sie Fälle wie "und mydate ist nicht null" behandeln, usw.

Nulldaten sind normalerweise mehr Arbeit. aber sie viel viel viel schneller als Null Daten für Abfragen.

1

Speziell auf den Fehler beziehen Sie bekommen, können Sie nicht in MySQL für eine Nullable-Feld so etwas wie dies in PHP tun:

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

Da null in PHP auf einen leeren String gleichsetzen wird, die ist nicht das gleiche wie ein NULL-Wert in MysQL. Stattdessen wollen Sie dies tun:

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

Natürlich müssen Sie nicht verwenden is_null aber ich glaube, dass es den Punkt ein wenig besser demonstriert. Wahrscheinlich sicherer, leer zu verwenden() oder so ähnlich. Und wenn $ col2 eine Zeichenkette ist, die Sie in doppelte Anführungszeichen in der Abfrage einfügen würden, vergessen Sie nicht nicht um die um die 'NULL'-Zeichenkette einzuschließen, sonst wird es nicht funktionieren.

Hoffe, dass hilft!

+0

Im ersten Beispiel könnten Sie einfach folgendes tun: '$ sql = 'INSERT INTO Tabelle (col1, col2) VALUES ('. $ Col1. ', Null)';' – Pere

2

Für was es wert ist: Ich hatte ein ähnliches Problem beim Aktualisieren einer MySQL-Tabelle über Perl. Die Aktualisierung schlägt fehl, wenn ein leerer Zeichenfolgenwert (aus einem Nullwert von einem Lesevorgang von einer anderen Plattform übersetzt) ​​an die Datumsspalte übergeben wurde ('dtcol' im folgenden Codebeispiel).Ich war schließlich erfolgreich, die Daten aktualisiert zu bekommen, indem ich eine IF-Anweisung verwendete, die in meine update-Anweisung eingebettet wurde:

3

Ich hatte dieses Problem auf Windows.

Dies ist die Lösung:

To 'Pass' für NULL Sie STRICT_MODE deaktivieren sollte (die standardmäßig auf Windows-Installationen aktiviert ist)

BTW lustig passieren Es ist '' für NULL. Ich weiß nicht, warum sie sich so verhalten.

0

Ich habe gerade festgestellt, dass MySQL null nimmt, vorausgesetzt, der Standardwert für das Feld ist null und ich schreibe spezifische if-Anweisungen und lasse die Anführungszeichen weg. Dies funktioniert auch für das Update.

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