From c0ae40c638a92463376f665c0baee02bc2bb93af Mon Sep 17 00:00:00 2001 From: Syngnat Date: Sun, 10 May 2026 17:29:11 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20fix(mysql):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=97=A7=E7=89=88=20Windows=20=E6=97=A0=E6=B3=95=E8=A7=A3?= =?UTF-8?q?=E6=9E=90=20Asia/Shanghai=20=E6=97=B6=E5=8C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 嵌入 Go IANA 时区数据,兼容 Windows Server 2012 等缺少 zoneinfo 的环境 - 保持 MySQL serverTimezone=GMT+8 到 loc=Asia/Shanghai 的时间语义 - 增加 MySQL DSN 时区解析回归测试 Refs #449 --- internal/db/mysql_connection_params_test.go | 23 +++++++++++++++++++++ internal/db/timezone_data.go | 6 ++++++ 2 files changed, 29 insertions(+) create mode 100644 internal/db/timezone_data.go diff --git a/internal/db/mysql_connection_params_test.go b/internal/db/mysql_connection_params_test.go index 765d867..f98de79 100644 --- a/internal/db/mysql_connection_params_test.go +++ b/internal/db/mysql_connection_params_test.go @@ -1,6 +1,7 @@ package db import ( + "database/sql" "net/url" "strings" "testing" @@ -121,6 +122,28 @@ func TestMySQLDSN_MapsJDBCUTF8EncodingToMySQLCharset(t *testing.T) { } } +func TestMySQLDSN_AsiaShanghaiLocationAcceptedByDriver(t *testing.T) { + t.Parallel() + + m := &MySQLDB{} + dsn, err := m.getDSN(connection.ConnectionConfig{ + Host: "127.0.0.1", + Port: 3306, + User: "root", + Database: "app", + ConnectionParams: "serverTimezone=GMT%2B8", + }) + if err != nil { + t.Fatalf("getDSN failed: %v", err) + } + + db, err := sql.Open("mysql", dsn) + if err != nil { + t.Fatalf("mysql driver should accept loc=Asia/Shanghai: %v", err) + } + _ = db.Close() +} + func TestMySQLDSN_URIParamsAndExplicitParamsPrecedence(t *testing.T) { t.Parallel() diff --git a/internal/db/timezone_data.go b/internal/db/timezone_data.go new file mode 100644 index 0000000..b2857a0 --- /dev/null +++ b/internal/db/timezone_data.go @@ -0,0 +1,6 @@ +package db + +// Embed the IANA time zone database so Windows deployments without zoneinfo +// files, such as Windows Server 2012, can still resolve locations like +// Asia/Shanghai when database drivers parse DSN time zone parameters. +import _ "time/tzdata"