contrib/drivers/dm: 拼接 DSN 时 loc 参数少了等号,timezone 配置不生效
Author: lingcoderCreated Aug 10, 2026Updated Aug 10, 2026
问题
contrib/drivers/dm/dm_open.go:50 拼接 DSN 时,loc 后面漏了一个 =:
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):
source = fmt.Sprintf("%s&loc=%s", source, config.Timezone)两处代码除了这个 = 完全一样,且 dm_open.go:45 的注释写的就是 &loc=Asia/Shanghai,可以确认是笔误。
引入于 commit 8266a16b4(#3289)。
修复
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
Source: gogf/gf