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

Nichtübereinstimmung zwischen DATETIME-Werten in H2- und MySQL-Datenbanken, eingefügt aus Java/Kotlin

Es sieht also so aus, als ob die Lösung darin bestand, die UTC-Zeitzone für die JDBC-Verbindung festzulegen (anstelle von JVM):

spring.jpa.properties.hibernate.jdbc.time_zone=UTC

und es ist auf die Verwendung von Instant angewiesen zum Beibehalten des Werts auf Java-Seite und mit created_at Feld vom Typ DATETIME in MySQL und H2.

Der verkürzte resultierende Kotlin-Code lautet:

@Entity
data class SomeEntity(
    val createdAt: Instant = Instant.now() // default created date is current UTC time
)

val dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd H:mm:ss")

createdAt = LocalDateTime.parse("2012-11-30 16:13:21", dateTimeFormatter).toInstant(ZoneOffset.UTC)

Ideen aus Kommentaren von "Joop Eggen", dies und dies Artikel.

Bonus

Ich schätze, wenn Sie dies lesen, brauchen Sie vielleicht auch Hilfe beim Debuggen von SQL-Abfragen.

1. Um SQL-Abfragen zu drucken, die auf H2 ausgeführt werden, fügen Sie TRACE_LEVEL_FILE=2 hinzu und TRACE_LEVEL_SYSTEM_OUT=2 zur Verbindungszeichenfolge (siehe hier ). ):

spring.datasource.url=jdbc:h2:mem:dbname;TRACE_LEVEL_FILE=2;TRACE_LEVEL_SYSTEM_OUT=2;

2. So aktivieren Sie Ruhezustandsprotokolle:

spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.use_sql_comments=true
spring.jpa.properties.hibernate.format_sql=true
logging.level.org.hibernate.type=TRACE

3. So aktivieren Sie Abfrageprotokolle in MySQL (einer der Ansätze, nicht in Produktionsdatenbanken verwenden!):

SET GLOBAL general_log = 'ON';
SET global log_output = 'table';
select * from mysql.general_log ORDER BY event_time DESC;