sql >> Database >  >> RDS >> Mysql

Spring Boot met Hibernate:automatisch genererend databaseschema met kolommen die fracties van seconden kunnen bevatten

MySql57Dialect (en/of MySql57InnoDbDialect , afhankelijk van de versie van Hibernate), de TIMESTAMP SQL-type is al toegewezen aan een TIMESTAMP(6) type databasekolom:

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

Dit betekent dat de standaard kolomdefinitie microseconde precisie moet ondersteunen. De beste manier van handelen is om Hibernate het schema te laten genereren zonder de kolomdefinitie te negeren. Voor de meeste andere databases zal het geleidelijk degraderen tot een eenvoudige TIMESTAMP .

Als je in de toekomst wilt overschakelen naar een andere database die ook microseconde precisie ondersteunt, zoek dan het relevante Dialect op; het zal waarschijnlijk ondersteuning voor de functie bevatten, en als dat niet het geval is, kunt u deze altijd aanpassen.

Dit komt omdat in het registerColumnType oproep hierboven, de precisie van de TIMESTAMP is vastgesteld op 6. Als je het wilt kunnen aanpassen, rol dan je eigen aangepaste dialect uit (uitbreidbaar van MySql57Dialect ) en overschrijf de definitie met:

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

U kunt dan de kolomlengte overschrijven met behulp van length , precision , of scale (afhankelijk van wat je tussen de haakjes plaatst). Merk op dat het tweede argument van de methode de maximaal mogelijke kolomlengte voor dit specifieke datatype definieert, dus als u b.v. nanoseconde precisie, moet u deze wijzigen in 9.




  1. Een beschadigde Access-database herstellen

  2. MySQL-trigger om gegevens in verschillende DB's in te voegen

  3. Hoe SQLite Count() werkt

  4. Generieke Ruby-oplossing voor SQLite3 LIKE of PostgreSQL ILIKE?