MySQL Ustaw czas UTC jako domyślny znacznik czasu

35

Jak ustawić kolumnę datownika, której domyślną wartością jest bieżący czas UTC?

MySQL używa UTC_TIMESTAMP()funkcji znacznika czasu UTC:

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

Więc próbowałem:

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

I inne warianty UTC_TIMESTAMP(), ale bez powodzenia.

Adam Matan
źródło
Próbowałeś CURRENT_TIMESTAMP?
ypercubeᵀᴹ
1
Działa, ale nie przechowuje wartości lokalnej strefy czasowej zamiast UTC.
Adam Matan
Co dokładnie chcesz zrobić? Czy przechowywać w kolumnie tabeli znacznik czasu UTC? Albo coś innego?
ypercubeᵀᴹ
8
Z typów DATA, DATETIME i TIMESTAMP :MySQL converts TIMESTAMP values from the current time zone to UTC for storage, and back from UTC to the current time zone for retrieval.
ypercubeᵀᴹ
3
Pamiętaj, że przechowywanie jako UTC dotyczy tylko typu danych TIMESTAMP, a nie DATE i DATETIME (chociaż możesz ustawić ich wartość domyślną CURRENT_TIMESTAMP). Z tej samej strony dokumentacja: (This does not occur for other types such as DATETIME.).
AronVanAmmers

Odpowiedzi:

49

Aby postępować zgodnie z komentarzem @ ypercube, który CURRENT_TIMESTAMPjest przechowywany jako UTC, ale jest pobierany jako bieżąca strefa czasowa, możesz wpłynąć na ustawienie strefy czasowej swojego serwera za pomocą opcji --default_time_zone do pobierania. Pozwala to na pobieranie zawsze w UTC.

Domyślnie opcją jest „SYSTEM”, czyli sposób ustawiania strefy czasowej systemu (która może, ale nie musi być 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)

Możesz ustawić to dynamicznie:

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)

Lub na stałe w twoim my.cnf:

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

Uruchom ponownie serwer, a zobaczysz zmianę:

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)
Derek Downey
źródło
2
Bardzo pomocny post !!
om39a
Czy można określić default_time_zonekonkretną tabelę lub bazę danych? Dzięki.
WM
2
Czy możliwe jest określenie default_time_zone dla konkretnego zapytania?
mcmillab
@mcmillab można ustawić strefę czasową sesji przed uruchomieniem zapytania, a następnie zresetować do globalnej strefy czasowej przed uruchomieniem dalszych zapytań (lub ponownego połączenia).
Derek Downey,
Podążając za mcmillab - lub zapytać kolumnę za pomocą operatora, który pokazuje podstawową wartość UTC (ponieważ konwersja nie jest 1 na 1)?
Marc L.
4

Nie można określić UTC_TIMESTAMPdomyślnie, aby określić właściwości automatyczne, należy używać tylko DOMYŚLNYCH CURRENT_TIMESTAMPi ON UPDATE CURRENT_TIMESTAMPklauzul.

Możesz jednak WSTAWIĆ UTC_TIMESTAMPtakie wartości dla tabeli:

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

Zapytanie INSERT wyglądałoby tak, aby wstawić UTC_TImeSTAMP:

insert into `test` (`ts`) 
values
  (utc_timestamp()) ;
Mahesh Patil
źródło
Dzięki za „Nie możesz określić UTC_TIMESTAMP jako domyślnego, aby określić właściwości automatyczne”
Barbaros Alp
4

Moje rozwiązanie ma wyzwalacz:

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

Następnie każdy nowy wstawiony wiersz będzie miał znacznik czasu w UTC.

Alqin
źródło
1

dla mariadb działały tylko globalne rozwiązania my.cnf

dla mariadb 10.2, trwałe rozwiązanie @Derek Downey w tym poście.

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

mariadb 10.0 (miałem 10.0.32), patrz https://stackoverflow.com/questions/947299/how-do-i-make-mysqls-now-and-curdate-functions-use-utc

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

obie definicje mogą współistnieć w my.cnf mariadb 10.2, ale nie mam już mariadb 10.0.

mam nadzieję, że ci to pomoże.

Alex Bodnaru
źródło