使用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
相关产品推荐
相关产品推荐

