sql >> データベース >  >> RDS >> Mysql

Java/Kotlinから挿入されたH2データベースとMySQLデータベースのDATETIME値の不一致

    したがって、修正は(JVMではなく)JDBC接続のUTCタイムゾーンを設定することだったようです:

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

    Instantの使用に依存しています Java側でcreated_atを使用して値を保持するため MySQLおよびH2でDATETIMEタイプのフィールド。

    結果として得られる短縮されたkotlinコードは次のとおりです。

    @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)
    

    「JoopEggen」、これ のコメントから得られたアイデア およびこれ 記事。

    ボーナス

    これを読んでいるのなら、SQLクエリのデバッグについても助けが必要かもしれません。

    1。 H2で実行されているSQLクエリを印刷するには、TRACE_LEVEL_FILE=2を追加します。 およびTRACE_LEVEL_SYSTEM_OUT=2 接続文字列へ(こちら を参照) ):

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

    2。 休止状態のログを有効にするには:

    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。 MySQLでクエリログを有効にするには(アプローチの1つ、本番データベースでは使用しないでください!):

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



    1. SQLエラー私はこれを理解することはできません

    2. MySQL:PREPAREコマンドで名前付きパラメーター?

    3. MySQLの丸め関数

    4. SQLサーバー接続を介してテナントIDを渡す