it-swarm-eu.dev

MySQL Nastaví čas UTC jako výchozí časové razítko

Jak nastavím sloupec časového razítka, jehož výchozí hodnota je aktuální čas UTC?

MySQL používá funkci UTC_TIMESTAMP() pro časové razítko UTC:

mysql> SELECT UTC_TIMESTAMP();
+---------------------+
| UTC_TIMESTAMP()     |
+---------------------+
| 2012-07-01 11:36:35 |
+---------------------+
1 row in set (0.00 sec)

Zkusil jsem tedy:

CREATE TABLE `blah` (
`creation_time` TIMESTAMP DEFAULT UTC_TIMESTAMP,
...

A další variace, jako UTC_TIMESTAMP(), ale bez úspěchu.

36
Adam Matan

Pokračovat s komentářem @ ypercube, který CURRENT_TIMESTAMP je uloženo jako UTC, ale načteno jako aktuální časové pásmo, můžete ovlivnit nastavení časového pásma vašeho serveru pomocí možnosti - default_time_zone pro vyvolání. To umožňuje, aby vaše vyhledávání bylo vždy v UTC.

Ve výchozím nastavení je možnost „SYSTÉM“, což je způsob, jakým je nastaveno časové pásmo vašeho systému (což může nebo nemusí být UTC!):

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | SYSTEM              |
+--------------------+---------------------+
1 row in set (0.00 sec)

mysql> SELECT CURRENT_TIMESTAMP();
+---------------------+
| CURRENT_TIMESTAMP() |
+---------------------+
| 2012-09-25 16:28:45 |
+---------------------+
1 row in set (0.00 sec)

Můžete to nastavit dynamicky:

mysql> SET @@session.time_zone='+00:00';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | +00:00              |
+--------------------+---------------------+
1 row in set (0.00 sec)

Nebo trvale ve vašem my.cnf:

[mysqld]
**other variables**
default_time_zone='+00:00'

Restartujte server a uvidíte změnu:

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| +00:00             | +00:00              |
+--------------------+---------------------+
1 row in set (0.00 sec)

mysql> SELECT CURRENT_TIMESTAMP();
+---------------------+
| CURRENT_TIMESTAMP() |
+---------------------+
| 2012-09-25 20:27:50 |
+---------------------+
1 row in set (0.01 sec)
50
Derek Downey

Nelze zadat UTC_TIMESTAMP jako výchozí určete automatické vlastnosti, měli byste použít pouze VÝCHOZÍ CURRENT_TIMESTAMP a ON UPDATE CURRENT_TIMESTAMP doložky.

Můžete také vložit UTC_TIMESTAMP hodnoty, jako je tato pro tabulku:

CREATE TABLE `test` (
  `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

INSERT dotaz by byl takový jako vložit UTC_TImeSTAMP:

insert into `test` (`ts`) 
values
  (utc_timestamp()) ;
4
Mahesh Patil

Moje řešení je se spouští:

DELIMITER //
CREATE TRIGGER `update_to_utc` BEFORE INSERT ON `my_table` FOR EACH ROW BEGIN
set new.my_field=utc_timestamp();
END//
DELIMITER ;

Každý nový vložený řádek pak bude mít časové razítko v UTC.

4
Alqin

pro mariadb fungovala pouze globální řešení my.cnf

pro mariadb 10.2, trvalé řešení @ Dekek Downey v tomto příspěvku.

[mysqld]
**other variables**
default_time_zone='+00:00'

pro mariadb 10.0 (měl jsem 10.0,32), viz https://stackoverflow.com/questions/947299/how-do-i-make-mysqls-now-and-curdate-functions-use-utc

[mysqld_safe]
**other variables**
timezone = UTC

obě definice mohou koexistovat v my.cnf mariadb 10.2, ale už nemám mariadb 10.0.

doufám, že vám to pomůže.

1
Alex Bodnaru