Se você pretende usar time zones ou fusos horários no MySQL, pelo nome, é bom ter certeza de que as tabelas contendo estas informações estão atualizadas e povoadas — prontas para uso.
Se você não tem certeza de que os nomes das zonas de fusos horários estão disponíveis — tanto para a configuração do servidor, quanto para uso dos clientes (que pretendem ajustar seus próprios fusos), — faça o seguinte teste, dentro do console do cliente MySQL:
SELECT COUNT(*) FROM mysql.time_zone_name; +----------+ | COUNT(*) | +----------+ | 0 | +----------+
No exemplo, acima, a função COUNT() retornou o valor 0 — o que indica a impossibilidade de se referenciar às zonas de fuso horário pelos seus nomes.
O segundo caso, do exemplo abaixo, fica evidenciado que a tabela de nomes de zonas de fusos horários está presente:
SELECT COUNT(*) FROM mysql.time_zone_name; +----------+ | COUNT(*) | +----------+ | 1790 | +----------+
Neste texto, vamos nos debruçar sobre uma solução para o primeiro caso.
O processo de instalação do MySQL cria as tabelas de fusos horários (time zone tables), mas não carrega os valores para dentro delas — ou seja, não as povoa. Você precisa fazer isto manualmente, caso queira se referir aos fusos horários por nome.
- Sistemas operacionais, como Linux, FreeBSD, Solaris e OSX têm sua própria base de dados zoneinfo, que consiste em um conjunto de arquivos descritores dos fusos horários. Neste caso, você pode usar o utilitário
mysql_tzinfo_to_sql
para preencher as tabelas de zonas de fusos.
Para usuários Windows, é possível fazer o download do pacote de banco de dados de zonas de fusos horários para MySQL em http://dev.mysql.com/downloads/timezones.html.
Neste texto, uso como exemplo, o sistema operacional GNU/Linux Ubuntu 14.04 LTS — portanto, o procedimento deve ser o mesmo para qualquer sistema baseado no Debian.
No Ubuntu 14.04 os arquivos zoneinfo, pode ser encontrados em /usr/share/zoneinfo/
:
ls /usr/share/zoneinfo/ Africa Chile Factory Iceland MET posix UCT America CST6CDT GB Indian Mexico posixrules Universal Antarctica Cuba GB-Eire Iran MST PRC US Arctic EET GMT iso3166.tab MST7MDT PST8PDT UTC Asia Egypt GMT0 Israel Navajo right WET Atlantic Eire GMT-0 Jamaica NZ ROC W-SU Australia EST GMT+0 Japan NZ-CHAT ROK zone.tab Brazil EST5EDT Greenwich Kwajalein Pacific Singapore Zulu Canada Etc Hongkong Libya Poland SystemV CET Europe HST localtime Portugal Turkey
Veja, a seguir, como trabalhar com estes arquivos.
Como povoar o banco de dados usando o mysql_tzinfo_to_sql
Este processo é muito simples e rápido. Use a seguinte linha de comando:
mysql_tzinfo_to_sql /usr/share/zoneinfo/ | mysql -u root -p mysql
O que o comando acima faz é “jogar” todos os arquivos do diretório /usr/share/zoneinfo/
(pode variar de acordo com o seu sistema), bem como de seus subdiretórios, dentro do banco de dados mysql
, nas tabelas apropriadas.
Uma vez feito este procedimento, já é possível se referir aos fusos horários, dentro do MySQL, por seus nomes.
A documentação oficial do MySQL (link ao final do tópico), adverte para não baixar e usar pacotes, caso seu sistema operacional já tenha um banco de dados zoneinfo. Use o aplicativo utilitário
mysql_tzinfo_to_sql
.
Após a execução do comando mysql_tzinfo_to_sql
, é recomendável reiniciar o servidor de banco de dados, para evitar que ele use dados de fusos horários contidos na cache:
sudo service mysql restart
Como ajustar o fuso horário no MySQL
Veja como é possível ajustar o fuso, referindo-se ao nome:
SELECT * FROM mysql.time_zone_name WHERE Name LIKE '%Fortaleza%'; _
+-------------------------+--------------+ | Name | Time_zone_id | +-------------------------+--------------+ | America/Fortaleza | 113 | | posix/America/Fortaleza | 710 | | right/America/Fortaleza | 1307 | +-------------------------+--------------+ 3 rows in set (0.00 sec)
SET time_zone='America/Fortaleza'; Query OK, 0 rows affected (0.00 sec) SELECT @@time_zone; _
+-------------------+ | @@time_zone | +-------------------+ | America/Fortaleza | +-------------------+ 1 row in set (0.00 sec)
No artigo Como ajustar o fuso horário ou a timezone no MySQL, você pode encontrar uma relação completa de fusos horários do Brasil e de outros países de língua portuguesa — além disto, há outros exemplos de uso e ajuste dos fusos horários no MySQL.
Referências: https://dev.mysql.com/doc/refman/5.7/en/time-zone-support.html#time-zone-installation.