[JAVA] Worauf ich in MySQL 5.5-> 5.7 gestoßen bin

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

Veranstaltung

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.

Ursache

In MySQL 5.6 wurde der Typ "datetime" nach dem Dezimalpunkt von "Etage" in "Rund" geändert. → Offizielles Dokument

Bewältigung

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.

Lektion

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.

DISTINCT Syntaxfehler in angegebenem SQL

Veranstaltung

Beim Ausführen von SQL mit DISTINCT ist ein Syntaxfehler aufgetreten.

Ursache

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.

Bewältigung

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

Lektion

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

Worauf ich in MySQL 5.5-> 5.7 gestoßen bin
Geben Sie den MySQL-Socket in Hanami an
Häufig verwendete Befehle für MySQL-Operationen
Speichern Sie UUID-Daten in MySQL als 16 Byte
Implementierung von DBlayer in Java (RDB, MySQL)
Bearbeiten Sie MySQL mit Befehlen in der Docker-Umgebung
Verwendung von MySQL im Rails-Tutorial
Japanische Einstellungen für MySQL im Docker-Container
Externe Veröffentlichung und Anmeldung von MySQL unter Ubuntu
Fügen Sie CSV-Dateien mit "'" und "" "in Ruby 2.3 in MySQL ein
Löschen Sie alle Datensätze in einer Tabelle in einer MySQL-Datenbank
MySQL-Fehler in der Spalte Spring Unknown 'Value 1'in'field list'