使用Go database/sql无法连接MySQL 5.7的问题求助
解决Go连接MySQL 5.7报1130错误的问题
问题原因
命令行通过mysql -u root -pxxx -h localhost连接时,MySQL默认使用Unix socket(Windows下是命名管道)方式建立连接,此时识别的主机是localhost;而Go代码里@tcp(localhost:3306)是强制用TCP/IP协议连接,MySQL会将其识别为来自127.0.0.1的请求。你的MySQL 5.7中root账号仅授权了localhost(socket连接),未授权127.0.0.1(TCP连接),所以触发1130错误。MySQL 8默认已对127.0.0.1授权,因此可以正常连接。
解决方案
方案1:改用Socket连接(推荐,和命令行连接方式一致)
修改Go代码中的DSN,使用Unix socket路径替代TCP地址:
import ( "database/sql" _ "github.com/go-sql-driver/mysql" ) // 替换为你的MySQL实际socket路径 db, err := sql.Open("mysql", "root:xxx@unix(/var/run/mysqld/mysqld.sock)/mydb") if err != nil { // 处理错误 } err = db.Ping()
不同系统的socket路径参考:
- Linux:
/var/run/mysqld/mysqld.sock - macOS(Homebrew安装):
/tmp/mysql.sock - Windows:可以尝试使用
pipe://./pipe/mysql作为socket路径
方案2:给127.0.0.1的root账号授权
如果需要保持TCP/IP连接方式,登录MySQL命令行执行以下授权语句:
-- 授权root从127.0.0.1访问mydb数据库的所有权限 GRANT ALL PRIVILEGES ON mydb.* TO 'root'@'127.0.0.1' IDENTIFIED BY 'xxx'; -- 刷新权限使设置生效 FLUSH PRIVILEGES;
执行完后,原Go代码即可正常连接。
内容的提问来源于stack exchange,提问作者clarkk
相关产品推荐
相关产品推荐

