#4839·gf

contrib/drivers/dm: 拼接 DSN 时 loc 参数少了等号,timezone 配置不生效

Author: lingcoderCreated Aug 10, 2026Updated Aug 10, 2026

问题

contrib/drivers/dm/dm_open.go:50 拼接 DSN 时,loc 后面漏了一个 =

go
source = fmt.Sprintf("%s&loc%s", source, config.Timezone)

配置 timezone: Asia/Shanghai 时,拼出来的是:

&locAsia%2FShanghai      // 实际
&loc=Asia%2FShanghai     // 应该

参数名变成了 locAsia%2FShanghai,达梦驱动无法识别,timezone 配置完全不生效

佐证

同一段代码在 mysql 驱动里是对的(contrib/drivers/mysql/mysql_open.go:54):

go
source = fmt.Sprintf("%s&loc=%s", source, config.Timezone)

两处代码除了这个 = 完全一样,且 dm_open.go:45 的注释写的就是 &loc=Asia/Shanghai,可以确认是笔误。

引入于 commit 8266a16b4(#3289)。

修复

go
source = fmt.Sprintf("%s&loc=%s", source, config.Timezone)

补充

我在 gitee.com/chunanyong/dm v1.8.12 里没有找到对 loc 参数的处理逻辑,所以修好等号之后,达梦是否真的支持用 loc 设置时区还需要确认。如果不支持,可能需要换成达梦自己的连接参数。不过无论如何,当前这行代码的写法都是错的。

环境

  • master (22c07b252)
  • contrib/drivers/dm,gitee.com/chunanyong/dm v1.8.12