Como faço para definir uma coluna de carimbo de data/hora cujo valor padrão é a hora UTC atual?
MySQL usa UTC_TIMESTAMP()
função para timestamp UTC:
mysql> SELECT UTC_TIMESTAMP();
+---------------------+
| UTC_TIMESTAMP() |
+---------------------+
| 2012-07-01 11:36:35 |
+---------------------+
1 row in set (0.00 sec)
Então eu tentei:
CREATE TABLE `blah` (
`creation_time` TIMESTAMP DEFAULT UTC_TIMESTAMP,
...
E outras variações, como UTC_TIMESTAMP()
, mas sem sucesso.
Para acompanhar o comentário de @ypercube que
CURRENT_TIMESTAMP
é armazenado como UTC, mas recuperado como o fuso horário atual, você pode afetar a configuração de fuso horário do seu servidor com a opção --default_time_zone para recuperação. Isso permite que sua recuperação esteja sempre em UTC.Por padrão, a opção é 'SYSTEM', que é como o fuso horário do seu sistema é definido (que pode ou não ser UTC!):
Você pode definir isso dinamicamente:
Ou permanentemente em seu my.cnf:
Reinicie seu servidor e você verá a mudança:
Com o MySql 8.0.13 , você pode usar
UTC_TIMESTAMP
como o valor padrão se o cercar com parênteses assim ...Você não pode especificar
UTC_TIMESTAMP
como padrão para especificar propriedades automáticas, você deve usar apenas as cláusulas DEFAULTCURRENT_TIMESTAMP
e .ON UPDATE CURRENT_TIMESTAMP
Além disso, você pode INSERT
UTC_TIMESTAMP
valores como este para uma tabela:A consulta INSERT ficaria assim para inserir UTC_TImeSTAMP:
Minha solução é com um gatilho:
Então, cada nova linha inserida terá o carimbo de data/hora em UTC.
para mariadb apenas as soluções globais my.cnf funcionaram
para mariadb 10.2, a solução permanente de @Derek Downey neste post.
para mariadb 10.0 (eu tinha 10.0.32), veja https://stackoverflow.com/questions/947299/how-do-i-make-mysqls-now-and-curdate-functions-use-utc
ambas as definições podem coexistir no my.cnf do mariadb 10.2, mas não tenho mais o mariadb 10.0.
espero que isso irá ajudá-lo.
A solução de John C funcionou para mim com
mas também tive que alterar os modos sql porque quando tentei adicionar um índice a esta tabela recebi o erro "ERROR 1067 (42000): Invalid default value"
removendo os modos NO_ZERO_IN_DATE,NO_ZERO_DATE
resolveu o problema com a configuração dos índices.