Je l'ai compris à mes besoins. Je vais résumer ce que j'ai appris (désolé, ces notes sont prolixes; ils sont aussi beaucoup pour mon avenir saisine, c'est autre chose).
Contrairement à ce que j'ai dit dans un de mes précédents commentaires, DATETIME et TIMESTAMP champs ne se comportent différemment. Champs d'HORODATAGE (comme les docs indiquer) prendre toutes vous les envoyer dans "YYYY-MM-DD hh:mm:ss" de format et de le convertir à partir de votre fuseau horaire à l'heure UTC. L'inverse se produit de manière transparente à chaque fois que vous récupérer les données. Les champs DATETIME ne pas faire cette conversion. Ils prennent tout ce que vous envoyez et juste de le stocker directement.
Ni la date, ni le champ d'HORODATAGE types fidèle de stocker des données dans un fuseau horaire qui observe l'heure d'été. Si vous le magasin "2009-11-01 01:30:00" les champs n'ont aucun moyen de distinguer la version de 1:30 vous vouliez -- le -04:00 ou -05:00 version.
Ok, donc il faut stocker nos données dans un non fuseau horaire de l'heure d'été (telles que l'UTC). Champs d'HORODATAGE sont incapables de manipuler ces données avec précision pour des raisons que je vais vous expliquer: si votre système est configuré pour un fuseau horaire de l'heure d'été ensuite ce que vous mettez dans HORODATAGE ne peut pas être ce que vous obtenez en retour. Même si vous envoyez des données que vous avez déjà converti à l'UTC, il prendra en charge les données dans votre fuseau horaire local et de faire encore une autre conversion à l'UTC. Cet HORODATAGE de l'exécution locale-à-UTC-back-to-locale aller-retour est de perte de qualité lors de votre fuseau horaire local observe l'heure d'été (depuis "2009-11-01 01:30:00" cartes à 2 fois possible).
Avec DATETIME, vous pouvez stocker vos données dans n'importe quel fuseau horaire vous voulez et être sûr que vous allez obtenir ce que vous l'envoyer (vous n'avez pas forcé les pertes de navette aller-retour pour les conversions de champs d'HORODATAGE imposer sur vous). Donc la solution est d'utiliser un champ DATETIME et avant l'enregistrement dans le champ de convertir à partir de votre système de fuseau horaire, et ce, non l'heure d'été zone que vous souhaitez enregistrer dans (je pense que l'UTC est probablement la meilleure option). Cela vous permet de construire la logique de conversion dans votre langage de script, de sorte que vous pouvez enregistrer explicitement l'UTC équivalent de "2009-11-01 01:30:00 -04:00" ou ""2009-11-01 01:30:00 -05:00".
Une autre chose importante à noter est que MySQL de la date/heure de mathématiques fonctions ne fonctionnent pas correctement autour de l'heure d'été de limites si vous stockez vos dates de l'heure d'été TZ. Donc raison de plus pour économiser de l'UTC.
En un mot, j'ai ceci:
Lors de la récupération des données de la base de données:
Explicitement interpréter les données de la base de données que l'UTC à l'extérieur de MySQL afin d'obtenir une précision timestamp Unix. J'utilise le PHP de la fonction strtotime() fonction ou de sa classe DateTime pour cela. Il ne peut pas être fait de manière fiable à l'intérieur de MySQL utilisation de MySQL CONVERT_TZ() ou UNIX_TIMESTAMP() les fonctions, car CONVERT_TZ ne sortie d'un 'YYYY-MM-DD hh:mm:ss' valeur qui souffre de l'ambiguïté des problèmes, et UNIX_TIMESTAMP() assume son entrée dans le système de fuseau horaire, pas le fuseau horaire les données ont été stockées dans in (UTC).
Lors de l'entreposage de données pour la base de données:
Convertir votre date précise de l'UTC de temps que vous le désirez à l'extérieur de MySQL. Par exemple: avec du PHP de la classe DateTime, vous pouvez spécifier "2009-11-01 1:30:00 est" nettement de "2009-11-01 1:30:00 HAE", puis de le convertir à l'UTC et enregistrer la bonne heure UTC à votre champ DATETIME.
Ouf. Merci beaucoup pour tous les commentaires et de l'aide. J'espère que cela sauve quelqu'un d'autre quelques maux de tête en bas de la route.
BTW, je suis de voir cela sur MySQL 5.0.22 et 5.0.27