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