it-swarm.com.de

Einfügen von NULL in MySQL-Zeitstempel

Ich beobachte unerwartetes Verhalten beim Einfügen/Aktualisieren von NULL in einer MySQL-Timestamp-Spalte.

Beachten Sie die folgenden Aussagen.

create table temp(id int, hireDate timestamp default 0);
insert into temp (id) values(1);
insert into temp (id, hireDate) values(2, null);
select * from temp;
id  hireDate
-----------------------------
1   
2   2012-09-19 10:54:10.0

Die erste Einfügung (wenn hiredate in SQL nicht angegeben ist, ist hireDate null(0), was erwartet wird.

Wenn jedoch eine explizite Null in SQL übergeben wird, wird das aktuelle Datum eingefügt, was unerwartet ist. Warum passiert das?

Hinweis: Hibernate verwendet einen zweiten Inserttyp und wird daher zu einem Problem. Wie füge ich null in eine Timestamp-Spalte ein?

33

http://dev.mysql.com/doc/refman/5.0/de/timestamp-initialization.html

Außerdem können Sie jede TIMESTAMP-Spalte mit dem aktuellen Datum und der aktuellen Uhrzeit initialisieren oder aktualisieren, indem Sie ihr einen NULL-Wert zuweisen, sofern sie nicht mit dem NULL-Attribut definiert wurde, um NULL-Werte zuzulassen. 

31
Juris Malinens

Sie können NULL in einen MySQL-Zeitstempel einfügen und aktualisieren.

Erstellen Sie die Tabelle:

create table penguins(id int primary key auto_increment, the_time timestamp NULL);

Einige Zeilen einfügen:

insert into penguins(the_time) values (now());
insert into penguins(the_time) values (null);
insert into penguins(the_time) values (0);
insert into penguins(the_time) values ('1999-10-10 01:02:03');

Was druckt:

select * from penguins

1   2015-01-23 15:40:36
2   
3   0000-00-00 00:00:00
4   1999-10-10 01:02:03

Die Spalte the_time mit Datentyp: timestamp in der 2. Zeile hat den Wert NULL.

11
Eric Leschinski

Sie müssen den Standardwert für die Spalte hireDate ändern. Der Standardwert sollte null sein

Diese 

create table temp(id int, hireDate timestamp default 0);

Sollte das sein:

create table temp(id int, hireDate timestamp null);
4

Speichern Sie niemals einen Anwendungswert in einer MySQL-Zeitstempeltypspalte. Verwenden Sie den Zeitstempeltyp nur für datenbankserverseitige dynamische Zeitstempel (siehe Spaltenattribute DEFAULT und ON UPDATE) Aufruf der Spalten 'mysql_row_created_at' und 'mysql_row_updated_at'.

Beachten Sie, dass MySQL seinen Zeitstempeltyp physisch als numerisches UNIX-Epoch-Delta speichert. Daher hat es eine implizite Zeitzone von UTC, die es gegen Zeitzonenänderungen auf der Sitzungsebene (AKA-Verbindung) immun macht.

Halten Sie sich vom Typ 'datetime' fern, insbesondere wenn Sie Werte speichern, die eine bekannte Zeitzone haben. Der Typ 'datetime' ähnelt einer Reihe gepackter Zahlen. Es werden keine Zeitzonen-Details gespeichert.

Der Typ "Datum" ist im Allgemeinen in Ordnung. Beachten Sie jedoch, dass es in manchen Kontexten um Mitternacht (der aktiven Zeitzone) als datetime interpretiert wird, was dann zu allen verwirrenden 'datetime' führt, die Sie vermeiden sollten.

Verwenden Sie für anwendungsseitige Datum-Uhrzeit-Werte ein 'int unsigned', ein 'bigint' (signiert), ein 'double' (signiert) oder ein Dezimalzeichen (N, P), um UNIX-Epoch-Deltas einfach zu speichern Stellen Sie sicher, dass die Auflösung in einem Spaltennamensuffix angezeigt wird, wenn es sich nicht um Sekunden handelt.

Beispiele:

`mysql_row_created_at` TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
`mysql_row_updated_at` TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

`Epoch` int unsigned NOT NULL,
`Epoch_ms` bigint NOT NULL,
`Epoch_us` bigint NOT NULL,
`Epoch` double NOT NULL,
`Epoch6` decimal(16,6),

Behandeln Sie Ihre Datenbank so wenig wie möglich. So führen Sie Konvertierungen nur auf der Anwendungsseite durch, niemals auf der Datenbankseite.

Gut zu wissen über:

SELECT @@GLOBAL.TIME_ZONE
, @@SESSION.TIME_ZONE
, @@SESSION.TIMESTAMP
, UNIX_TIMESTAMP(NOW(6))
;
0
druud62

wenn Sie NULL in die Spalte hireDate Ihrer Tabelle einfügen möchten, müssen Sie null angeben

INSERT INTO temp (id, hireDate) VALUES(3, null);

Weil Datatype von hireDatetimestamp ist und beim Erstellen einer Spalte als null definiert werden sollte

0
M Khalid Junaid