Go语言 数据库/SQL无法连接到本地主机

eqoofvh9  于 2023-11-14  发布在  Go
关注(0)|答案(2)|浏览(155)

连接到mysql数据库mysql 5.7

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

db, err := sql.Open("mysql", "root:xxx@tcp(localhost:3306)/mydb")
err = db.Ping()

字符串
误差

Error 1130: Host '127.0.0.1' is not allowed to connect to this MySQL server


但是当通过命令行连接时没有错误?

mysql -u root -pxxx -h localhost


也已经连接到phpmyadmin与相同的用户/通行证没有问题,从本地主机

更新

如何现在试图连接到mysql 8和它的工作原理.如何连接到mysql 5.7?
在文档中它说它支持mysql 5.6+

5kgi1eie

5kgi1eie1#

通常使用主机名“localhost”不是127.0.0.1。它被特殊处理,导致MySQL客户端使用UNIX域套接字而不是TCP。
这也适用于GRANT。因此,如果您授予myuser@localhost,这意味着用户只能通过UNIX套接字进行访问。如果您希望用户能够使用TCP进行本地连接,则必须授予[[email protected]](https://stackoverflow.com/cdn-cgi/l/email-protection)或覆盖该IP地址的其他TCP模式。
在某种程度上,myuser@localhost[[email protected]](https://stackoverflow.com/cdn-cgi/l/email-protection)是完全不同的用户,他们甚至可以有不同的密码和权限。
然而,MySQL的Go驱动程序忽略了这个约定,原因只有它的开发人员知道。在尝试连接之前,Go驱动程序解析了连接字符串中的主机名,因此它会将“localhost”转换为127.0.0.1。对于MySQL,这意味着它实际上连接到了一个与您预期的用户不同的用户。
要在Go mysql驱动程序中使用UNIX域套接字,请阅读the documentation
对于TCP和UDP网络,地址的格式为host[:port]。如果省略port,则将使用默认端口。如果host是一个IPv6地址,则必须将其括在方括号中。函数net.JoinHostPort和net.SplitHostPort以这种形式操作地址。
对于Unix域套接字,地址是指向MySQL服务器套接字的绝对路径,例如/var/run/mysqld/mysqld.sock或/tmp/mysql. sock。
Go mysql驱动程序已经建立了自己的连接字符串约定。

rqenqsqc

rqenqsqc2#

可能是sqlx包出错了。请尝试像这样使用sql包:

db, err = sql.Open("mysql", "root:xxx@tcp(localhost:3306)/mydb")

字符串

相关问题