[JAVA] Ce sur quoi je suis tombé par hasard dans MySQL 5.5-> 5.7

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

un événement

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é.

Cause

Dans MySQL 5.6, le type datetime après la virgule décimale a été changé de sol en arrondi. → Document officiel

Faire face

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.

Leçon

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.

Erreur de syntaxe DISTINCT dans le SQL spécifié

un événement

Une erreur de syntaxe s'est produite lors de l'exécution de SQL avec DISTINCT.

Cause

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.

Faire face

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

Leçon

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

Ce sur quoi je suis tombé par hasard dans MySQL 5.5-> 5.7
Spécifiez le socket mysql dans Hanami
Commandes fréquemment utilisées pour les opérations MySQL
Enregistrer les données UUID dans MySQL sous 16 octets
Implémentation de DBlayer en Java (RDB, MySQL)
Modifier Mysql avec des commandes dans l'environnement Docker
Comment utiliser MySQL dans le didacticiel Rails
Paramètres japonais pour mysql dans le conteneur Docker
Publication externe et connexion de MySQL sur Ubuntu
Placez les fichiers CSV contenant "'" et "" "dans Ruby 2.3 dans MySQL
Supprimer tous les enregistrements d'une table dans une base de données MySQL
Erreur MySQL dans la colonne Spring Unknown "Valeur 1" dans la "liste des champs"