sql >> Database teknologi >  >> RDS >> Mysql

Spring Boot with Hibernate:Autogenerer databaseskema med kolonner, der kan rumme brøkdele af sekunder

MySql57Dialect (og/eller MySql57InnoDbDialect , afhængigt af versionen af ​​Hibernate), TIMESTAMP SQL-typen er allerede knyttet til en TIMESTAMP(6) database kolonnetype:

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

Dette betyder, at standardsøjledefinitionen skal understøtte mikrosekunders præcision. Den bedste fremgangsmåde er at lade Hibernate generere skemaet uden at tilsidesætte kolonnedefinitionen. For de fleste andre databaser degraderes den elegant til en simpel TIMESTAMP .

Hvis du ønsker at skifte til en anden database i fremtiden, som også understøtter mikrosekundpræcision, skal du slå den relevante Dialect op.; det vil sandsynligvis omfatte understøttelse af funktionen, og hvis ikke, kan du altid tilpasse det.

Dette er fordi i registerColumnType opkald ovenfor, præcisionen af ​​TIMESTAMP er fastsat til 6. Hvis du vil være i stand til at tilpasse det, skal du udrulle din egen tilpassede dialekt (forlænger fra MySql57Dialect ) og tilsidesæt definitionen med:

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

Du vil derefter være i stand til at tilsidesætte kolonnelængden ved at bruge enten length , precision eller scale (afhængig af hvad du sætter inden i beslagene). Bemærk at det andet argument til metoden definerer den maksimalt mulige kolonnelængde for netop denne datatype, så hvis du f.eks. nanosekunds præcision, bør du ændre den til 9.




  1. Laravel-migrering kan ikke oprette fremmednøgle

  2. Sådan finder du ud af, om der findes en unik nøglebegrænsning for givne kolonner

  3. mysql vælg datoer uden tabeller

  4. Docker MySQL - kan ikke oprette forbindelse fra Spring Boot-appen til MySQL-databasen