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