web-dev-qa-db-fra.com

MySQL Définir l'heure UTC comme horodatage par défaut

Comment définir une colonne d'horodatage dont la valeur par défaut est l'heure UTC actuelle?

MySQL utilise la fonction UTC_TIMESTAMP() pour l'horodatage UTC:

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

J'ai donc essayé:

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

Et d'autres variantes, comme UTC_TIMESTAMP(), mais sans succès.

36
Adam Matan

Pour aller avec le commentaire de @ ypercube que CURRENT_TIMESTAMP est stocké en UTC mais récupéré en tant que fuseau horaire actuel, vous pouvez affecter le paramètre de fuseau horaire de votre serveur avec l'option - default_time_zone pour la récupération. Cela permet à votre récupération d'être toujours en UTC.

Par défaut, l'option est 'SYSTEM' qui est la façon dont votre fuseau horaire système est défini (qui peut ou non être 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)

Vous pouvez définir ceci dynamiquement:

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)

Ou en permanence dans votre my.cnf:

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

Redémarrez votre serveur et vous verrez le changement:

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

Vous ne pouvez pas spécifier UTC_TIMESTAMP par défaut pour spécifier les propriétés automatiques, vous ne devez utiliser que le DEFAULT CURRENT_TIMESTAMP et ON UPDATE CURRENT_TIMESTAMP clauses.

Vous pouvez également INSÉRER UTC_TIMESTAMP des valeurs comme celle-ci pour une table:

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

INSÉRER la requête serait comme ceci pour insérer UTC_TImeSTAMP:

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

Ma solution est avec un déclencheur:

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

Ensuite, chaque nouvelle ligne insérée aura l'horodatage en UTC.

4
Alqin

pour mariadb, seules les solutions mondiales my.cnf ont fonctionné

pour mariadb 10.2, la solution permanente de @Derek Downey dans cet article.

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

pour mariadb 10.0 (j'avais 10.0.32), voir https://stackoverflow.com/questions/947299/how-do-i-make-mysqls-now-and-curdate-functions-use-utc

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

les deux définitions peuvent coexister dans my.cnf de mariadb 10.2, mais je n'ai plus mariadb 10.0.

j'espère que cela vous aidera.

1
Alex Bodnaru