You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用go-sql-driver/mysql连接MatrixOne时account:username:role模式失败

问题

用github.com/go-sql-driver/mysql驱动连接MatrixOne时,默认用户root能正常建立连接,但采用account:username:role格式的账号连接就失败,报错如下:

select failed: err[Error 20101 (HY000): internal error: there is no user.

测试代码:

import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
    "net/url"
)

func main() {
    _, err := sql.Open("mysql","account:admin:role:xxx@tcp(192.168.110.210:6001)/ssb")
    if err != nil {
        fmt.Printf("connect failed: err[%v]", err)
        return
    }
}
解决办法

go-sql-driver/mysql驱动本身不支持MatrixOne这种带冒号的account:username:role账号格式,直接写会被驱动错误解析——它默认把冒号当作用户名和密码的分隔符,导致传给MatrixOne的用户名变成account,自然找不到对应用户。

有两种可行的解决方式:

方式1:URL编码用户名

把包含冒号的完整账号做URL编码,转义掉冒号后再拼进连接字符串:

import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
    "net/url"
)

func main() {
    // 对账号进行URL编码,转义冒号
    encodedUser := url.QueryEscape("account:admin:role")
    dsn := fmt.Sprintf("%s:xxx@tcp(192.168.110.210:6001)/ssb", encodedUser)
    _, err := sql.Open("mysql", dsn)
    if err != nil {
        fmt.Printf("connect failed: err[%v]", err)
        return
    }
}

方式2:使用参数式DSN

改用键值对形式的DSN,明确通过user参数指定完整的账号,避免驱动自动拆分:

import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
)

func main() {
    dsn := "user=account:admin:role&password=xxx&net=tcp&addr=192.168.110.210:6001&dbname=ssb"
    _, err := sql.Open("mysql", dsn)
    if err != nil {
        fmt.Printf("connect failed: err[%v]", err)
        return
    }
}

内容的提问来源于stack exchange,提问作者BUCKY G

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 15:06:11