Não, não é possível alterar o fuso horário de um único banco de dados em uma instância MySQL.
Podemos recuperar o servidor e o cliente
time_zone
configurações com uma consulta, assim:SELECT @@global.time_zone, @@session.time_zone;
Também podemos alterar o fuso horário do cliente para uma sessão ou alterar o fuso horário para toda a instância do MySQL.
Mas precisamos estar bem cientes da implicação que essa mudança terá nas conexões de clientes existentes e como
DATETIME
e TIMESTAMP
valores já armazenados na instância serão interpretados. Para definir o fuso horário do servidor na inicialização da instância do MySQL, podemos modificar o
/etc/my.cnf
(ou onde quer que os parâmetros de inicialização da instância mysql sejam lidos), sob o [mysqld]
seção:[mysqld]
default-time-zone='+00:00'
-- ou --
Também é possível (menos desejável) adicionar o
--default_time_zone='+00:00'
opção para mysqld_safe OBSERVAÇÃO: Alterar a configuração de fuso horário no servidor MySQL NÃO altera os valores armazenados nas colunas DATETIME ou TIMESTAMP existentes, MAS, uma vez que altera efetivamente o contexto no qual esses valores armazenados são interpretados, parecerá que todos os valores SÃO deslocados. (Onde 08:00 foi considerado 8:00 CST, com o fuso horário do servidor alterado de CST para GMT, esse mesmo '08:00' agora será considerado 8:00 GMT, o que seria efetivamente 2:00 CST.
Lembre-se também de que as colunas TIMESTAMP são sempre armazenadas em UTC, enquanto as colunas DATETIME não têm fuso horário.http://dev.mysql.com/doc/refman/5.5/en/datetime.html
Cada sessão do cliente pode alterar a configuração de fuso horário para sua própria sessão:
SET time_zone='-06:00';
Mas nada disso realmente "resolve" o problema de conversão de fuso horário, apenas move o problema de conversão.
Não há nada inerentemente "ruim" na camada de aplicação que trata das conversões de fuso horário; às vezes, esse é o melhor lugar para lidar. Só precisa ser feito de forma correta e consistente.
(O que é estranho na configuração que você descreve é que o aplicativo está armazenando valores DATETIME como se o time_zone do servidor MySQL estivesse definido como GMT, mas o time_zone do servidor MySQL estivesse definido para outra coisa.)