Cet article vous présentera l'utilisation de la précision d'horodatage 1901 dans MySQL. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il sera utile à tout le monde.
Pourquoi la précision DATETIME dans MySQL ne prend-elle en charge que les secondes ?
Le type DATETIME dans MySQL est-il lié au fuseau horaire ?
Lors de la conception d'une table dans MySQL, comment choisir le champ représentant l'heure ?
Analyse de cas de problèmes de précision DATETIME
Il y a quelque temps, la version de mysql-connector-java de l'application responsable a été mise à niveau de 5.1.16 à 5.1.30, et j'ai découvert quand En effectuant une régression de fonction, les données d'exécution des cas d'utilisation similaires au SQL ci-dessus seront manquantes, ce qui entraînera des problèmes fonctionnels.
Considérant que dans l'application dont je suis responsable, il existe une fonction qui nécessite l'utilisation de SQL similaire à la suivante, c'est-à-dire utiliser l'horodatage comme condition de requête pour interroger toutes les données après un certain horodatage.
Après enquête, il a été constaté que mysql-connector-java rejetait la précision quelques secondes avant la version 5.1.23, puis la transmettait au serveur MySQL, ce qui s'est avéré être dans la version MySQL que nous avons utilisée, la précision de DATETIME est en secondes ; après la mise à niveau de mysql-connector-java vers 5.1.30, lorsque l'horodatage est transmis de l'application Java au serveur MySQL via mysql-connector-java, les millisecondes seront ne doit pas être écarté du point de vue de mysql-connector-java, cela corrige un BUG, mais pour mon application, cela déclenche un BUG.
Si vous êtes confronté à ce problème, comment le résoudriez-vous ?
Nous avons pensé à trois options à l'époque :
Changer le type de paramètre d'horodatage dans l'interface Mapper de mybatis de java.util.Date à java.sql.Date
Avant de passer à l'interface Mapper, l'horodatage entrant est corrigé par secondes. Le code est le suivant
Avant l'interrogation, l'horodatage entrant est décrémenté de 1 seconde ; 🎜>
Après vérification, la solution 1 sera que l'objet java.sql.Date converti à partir de java.util.Date perdra toute la précision après la date, ce qui entraînera l'interrogation de davantage de données inutiles, mais la solution 3 est possible ; une ou deux données supplémentaires peuvent être trouvées ; l'option 2 est également possible, ce qui équivaut à compenser les caractéristiques de mysql-connector-java en termes de code. Finalement, j'ai choisi l'option 2. Reproduction du casUtilisez homebrew pour installer MySQL. La version est 8.0.15. Après l'installation, créez une table pour stocker les informations utilisateur.
Après l'analyse précédente du cas réel et la récurrence du cas, les lecteurs doivent avoir une certaine compréhension du type DATETIME dans MySQL. Voyons ensuite quelles expériences nous pouvons résumer à partir de ce cas.
La version de mysql-connector-java et la version de mysql doivent être utilisées ensemble. Par exemple, pour les versions antérieures à 5.6.4, il est préférable de ne pas utiliser les versions antérieures à 5.1.23 de mysql-connector. -java, sinon il pourrait rencontrer les problèmes que nous avons rencontrés cette fois.
Les types de champs utilisés pour représenter l'heure dans MySQL sont : DATE, DATETIME et TIMESTAMP. Ils ont des similitudes et chacun a ses propres caractéristiques. J'ai résumé un tableau comme suit :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!