Lorsque j'ai mis à niveau une application Java qui utilisait MySQL 5.5 vers MySQL 5.7, j'ai rencontré des problèmes, je vais donc laisser la cause et la solution.
Datetime Field Overflow
Lorsque j'ai inséré un enregistrement contenant la valeur maximale «9999/12/31 23: 59: 59» dans une table avec une colonne de type «datetime», un dépassement de champ Datetime s'est produit et a échoué.
Dans MySQL 5.6, le type datetime
après la virgule décimale a été changé de sol en arrondi.
→ Document officiel
Ajout du processus pour réinitialiser la milliseconde (.000
) de la partie où la milliseconde de l'objet instancié par java.util.Calendar a été acquise.
before
Calendar cal = Calendar.getInstance();
cal.set(9999, 11, 31, 23, 59, 59);
cal.getTime();
↓
after
Calendar cal = Calendar.getInstance();
cal.set(9999, 11, 31, 23, 59, 59);
cal.clear(Calendar.MILLISECOND);
cal.getTime();
En tant qu'objet, étant donné que la milliseconde au moment de Calendar.getInstance ()
est acquise, elle change à chaque minutage d'exécution. À ce stade, si la milliseconde est inférieure à .499
, elle est sûre, mais .500
ou plus. Ensuite, il sera sorti.
Auparavant, il était tronqué, il était donc sans danger pour chaque milliseconde à tout moment.
Non limité à cela, il est important que l'application ne dépende pas des spécifications de la base de données.
À propos, ce changement semble suivre la norme SQL. (Du document officiel)
No warning or error is given when such rounding occurs. This behavior follows the SQL standard, and is not affected by the server sql_mode setting.
Une erreur de syntaxe s'est produite lors de l'exécution de SQL avec DISTINCT.
Depuis MySQL 5.7.5, ʻONLY_FULL_GROUP_BY` a été spécifié comme sql_mode par défaut. → Document officiel
sql_mode est une sorte de fonction de type validation qui vérifie la validité de la syntaxe, et il en existe plusieurs types. Parmi ceux-ci, ʻONLY_FULL_GROUP_BY` est "Lors de l'agrégation par GROUP BY, la colonne spécifiée dans la clause SELECT ou la clause ORDER BY est-elle incluse dans la clause GROUP BY?" Et "La colonne de la clause ORDER BY est incluse dans la liste des colonnes de DISTINCT." Il vérifie «si», et cette fois, il a violé ce dernier.
Correction du SQL à émettre.
before
SELECT
DISTINCT HOGE,
FUGA
FROM
T_USER
ORDER BY
USER_ID DESC
↓
after
SELECT
DISTINCT HOGE,
FUGA,
USER_ID
FROM
T_USER
ORDER BY
USER_ID DESC
Gardez à l'esprit que le SQL que vous émettez ne viole pas les paramètres actuels de sql_mode, ou si vous devez le faire, désactivez ce sql_mode.
c'est tout
Recommended Posts