使用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语言中连接MatrixOne数据库时,用户名和密码之间用冒号分隔。
因此,当用户名包含冒号时,会导致冒号之前的租户名称被解释为系统租户“sys”用户名,从而导致连接失败。为了避免这个问题,您可以使用
url.QueryEscape
对用户名进行编码,然后连接字符串。
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
"net/url"
)
func main() {
username := "account:admin:role"
encodeUsername := url.QueryEscape(username)
_, err := sql.Open("mysql", encodeUsername+":xxx@tcp(192.168.110.210:6001)/ssb")
if err != nil {
fmt.Printf("connect failed: err[%v]", err)
return
}
}