Als ich eine Java-App, die MySQL 5.5 verwendete, auf MySQL 5.7 aktualisierte, stieß ich auf einige Probleme, sodass ich die Ursache und Abhilfe hinterlassen werde.
Datetime Field Overflow
Als ich einen Datensatz mit dem Maximalwert "9999/12/31 23: 59: 59" in eine Tabelle mit einer Spalte vom Typ "datetime" einfügte, trat ein Datetime-Feldüberlauf auf und schlug fehl.
In MySQL 5.6 wurde der Typ "datetime" nach dem Dezimalpunkt von "Etage" in "Rund" geändert. → Offizielles Dokument
Der Prozess zum Zurücksetzen der Millisekunde (.000
) des Teils wurde hinzugefügt, in dem die Millisekunde des durch java.util.Calendar instanziierten Objekts erfasst wurde.
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();
Da die Millisekunde zum Zeitpunkt von "Calendar.getInstance ()" erfasst wird, ändert sie sich als Objekt zu jedem Ausführungszeitpunkt. Wenn die Millisekunde zu diesem Zeitpunkt kleiner als ".499" ist, ist sie sicher, aber ".500" oder mehr. Dann wird es raus sein. Zuvor war es abgeschnitten, sodass es jederzeit für jede Millisekunde sicher war.
Nicht darauf beschränkt ist es wichtig, dass die Anwendung nicht von den DB-Spezifikationen abhängt.
Diese Änderung scheint übrigens dem SQL-Standard zu folgen. (Aus offiziellem Dokument)
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.
Beim Ausführen von SQL mit DISTINCT ist ein Syntaxfehler aufgetreten.
Seit MySQL 5.7.5 wurde "ONLY_FULL_GROUP_BY" als Standard-SQL-Modus angegeben. → Offizielles Dokument
sql_mode ist eine Art validierungsähnliche Funktion, die die Gültigkeit der Syntax überprüft, und es gibt verschiedene Typen. Von diesen ist "ONLY_FULL_GROUP_BY" "Bei der Zusammenfassung nach GROUP BY ist die Spalte in der SELECT-Klausel oder der ORDER BY-Klausel in der GROUP BY-Klausel enthalten?" Und "Die Spalte in der ORDER BY-Klausel ist in der Spaltenliste von DISTINCT enthalten. Es prüft "ob" und verletzt diesmal das letztere.
Die auszustellende SQL wurde behoben.
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
Beachten Sie, dass das von Ihnen ausgegebene SQL nicht gegen die aktuellen Einstellungen für sql_mode verstößt. Wenn Sie dies benötigen, deaktivieren Sie diesen sql_mode.
das ist alles
Recommended Posts