Rust 使用sqlx连接mysql的时区问题

Mysql sqlx rust
作者:dulucy
发布时间:2025-04-26 11:09:16
Rust 使用sqlx连接mysql的时区问题

前言

本博客是采用Rust编写的后台,使用sqlx插件连接mysql数据库,但是在涉及时间保存的时候,总是默认是格林兰时区,而不是北京时区。即使已经调整了mysql的时区,仍然无法解决。因此判断是sqlx的问题导致,查阅网上的资料发现确实如此


一、原因

sqlx的底层连接数据库时,默认采用了UTC时区,因此总是相差8个小时。

二、解决办法

方法一:after_connect

使用after_connect执行 "SET time_zone='+08:00';" ,如下,但是我的不行,应该是sqlx的版本不同。我的sqlx:0.8.3 会提示没有after_connect方法


let pool = match MySqlPoolOptions::new()
           .after_connect(|conn, _meta| Box::pin(async move {
             conn.execute("SET time_zone='+08:00';").await?;
              Ok(())
           }))
          .connect(&db_url).await {
             Ok(value) => value,
                  Err(_)=>{
                    panic!("数据库连接失败,请检查网络或数据库设置");
                  }
        };

方法二:MySqlConnectOptions::new()

使用MySqlConnectOptions::new() 配置

let options = MySqlConnectOptions::new()
    .host("localhost")
    .username("username")
    .password("password")
    .database("database")
    .timezone("+8:00".to_string());
    
    let pool = MySqlPool::connect_with(options)
        .await
        .expect("创建连接池失败");

参考: