连接到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+
2条答案
按热度按时间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驱动程序已经建立了自己的连接字符串约定。
rqenqsqc2#
可能是sqlx包出错了。请尝试像这样使用sql包:
字符串