Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Spring Boot mit Hibernate:Automatisch generiertes Datenbankschema mit Spalten, die Bruchteile von Sekunden enthalten können

MySql57Dialect (und/oder MySql57InnoDbDialect , je nach Version von Hibernate), den TIMESTAMP Der SQL-Typ ist bereits einem TIMESTAMP(6) zugeordnet Datenbankspaltentyp:

registerColumnType( Types.TIMESTAMP, "datetime(6)" );

Dies bedeutet, dass die Standardspaltendefinition die Genauigkeit im Mikrosekundenbereich unterstützen sollte. Die beste Vorgehensweise besteht darin, Hibernate das Schema generieren zu lassen, ohne die Spaltendefinition zu überschreiben. Bei den meisten anderen Datenbanken wird es problemlos zu einem einfachen TIMESTAMP degradiert .

Wenn Sie in Zukunft auf eine andere Datenbank umsteigen möchten, die ebenfalls Mikrosekunden-Präzision unterstützt, schauen Sie im entsprechenden Dialect nach; Es wird wahrscheinlich Unterstützung für die Funktion enthalten, und wenn nicht, können Sie es jederzeit anpassen.

Dies liegt daran, dass im registerColumnType Aufruf oben, die Genauigkeit des TIMESTAMP ist auf 6 festgelegt. Wenn Sie es anpassen möchten, führen Sie Ihren eigenen benutzerdefinierten Dialekt ein (erweitert von MySql57Dialect ) und überschreibe die Definition mit:

registerColumnType(Types.TIMESTAMP, 6, "timestamp($l)"); //l for length, p for precicion, s for scale

Anschließend können Sie die Spaltenlänge mit length überschreiben , precision , oder scale (je nachdem, was Sie in die Klammern setzen). Beachten Sie, dass das zweite Argument der Methode die maximal mögliche Spaltenlänge für diesen bestimmten Datentyp definiert. Wenn Sie also z. Nanosekunden-Präzision, sollten Sie sie auf 9 ändern.