Eu tenho isso planejado para meus propósitos. Vou resumir o que aprendi (desculpe, essas notas são prolixas; são tanto para minha referência futura quanto qualquer outra coisa).
Ao contrário do que eu disse em um dos meus comentários anteriores, campos DATETIME e TIMESTAMP fazer se comportam de forma diferente. Os campos TIMESTAMP (como os documentos indicam) pegam tudo o que você enviar no formato "AAAA-MM-DD hh: mm: ss" e convertem do seu fuso horário atual para o horário UTC. O inverso acontece de forma transparente sempre que você recupera os dados. Os campos DATETIME não fazem essa conversão. Eles pegam tudo o que você envia e apenas armazenam diretamente.
Nem os tipos de campo DATETIME nem TIMESTAMP podem armazenar dados com precisão em um fuso horário que observe o DST . Se você armazenar "2009-11-01 01:30:00", os campos não terão como distinguir qual versão de 1:30 da manhã você deseja - a versão -04: 00 ou -05: 00.
Ok, então devemos armazenar nossos dados em um fuso horário diferente do horário de verão (como UTC). Os campos TIMESTAMP são incapazes de lidar com esses dados com precisão por motivos que explicarei: se o seu sistema estiver configurado para um fuso horário DST, então o que você colocar em TIMESTAMP pode não ser o que você receberá de volta. Mesmo se você enviar dados já convertidos para UTC, ele ainda assumirá os dados em seu fuso horário local e fará outra conversão para UTC. Esta viagem de ida e volta local-para-UTC-de-volta-para-local imposta por TIMESTAMP tem perdas quando seu fuso horário local segue o horário de verão (desde "2009-11-01 01:30:00" mapeia para 2 horários diferentes possíveis).
Com DATETIME você pode armazenar seus dados em qualquer fuso horário que desejar e ter a certeza de que receberá de volta tudo o que enviar (você não será forçado a fazer conversões de ida e volta com perdas que os campos do TIMESTAMP impõem a você). Portanto, a solução é usar um campo DATETIME e, antes de salvar no campo, converter do fuso horário do seu sistema para qualquer fuso horário não DST em que você deseja salvá-lo (acho que UTC é provavelmente a melhor opção). Isso permite que você construa a lógica de conversão em sua linguagem de script para que possa salvar explicitamente o equivalente UTC de "2009-11-01 01:30:00 -04: 00" ou "" 2009-11-01 01:30: 00 -05: 00 ".
Outra coisa importante a se notar é que as funções matemáticas de data / hora do MySQL não funcionam corretamente em torno dos limites do DST se você armazenar suas datas em um DST TZ. Portanto, mais um motivo para economizar em UTC.
Resumindo, agora faço o seguinte:
Ao recuperar os dados do banco de dados:
Interprete explicitamente os dados do banco de dados como UTC fora do MySQL para obter um carimbo de data / hora Unix preciso. Eu uso a função strtotime () do PHP ou sua classe DateTime para isso. Isso não pode ser feito de forma confiável dentro do MySQL usando as funções CONVERT_TZ () ou UNIX_TIMESTAMP () do MySQL porque CONVERT_TZ só produzirá um valor 'YYYY-MM-DD hh: mm: ss' que sofre de problemas de ambigüidade, e UNIX_TIMESTAMP () assume seu a entrada está no fuso horário do sistema, não no fuso horário em que os dados foram REALMENTE armazenados (UTC).
Ao armazenar os dados no banco de dados:
Converta sua data para a hora UTC precisa que você deseja fora do MySQL. Por exemplo: com a classe DateTime do PHP, você pode especificar "2009-11-01 1:30:00 EST" distintamente de "2009-11-01 1:30:00 EDT", então convertê-lo para UTC e salvar a hora UTC correta ao seu campo DATETIME.
Ufa. Muito obrigado pela contribuição e ajuda de todos. Esperançosamente, isso evita que alguém tenha algumas dores de cabeça no futuro.
BTW, estou vendo isso no MySQL 5.0.22 e 5.0.27