You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Golang sql库连接MySQL时用户名包含@符号该如何处理?

问题根因
  • 该异常由Go标准库database/sql依赖的go-sql-driver/mysql驱动的DSN解析逻辑导致:驱动默认将DSN中第一个@符号识别为「用户凭证段」和「连接地址段」的分隔符,当用户名本身包含@且未显式声明空密码时,解析器会误截取用户名片段作为地址解析,最终触发panic崩溃。
  • 你给出的示例DSN root@proxy@tcp(...)中的第一个@被错误判定为凭证和地址的分隔符,解析器尝试将proxy@tcp(172.21.30.22:3306)作为地址解析失败,就会出现崩溃问题。
修复方案

方案1:对用户名中的特殊字符做URL编码转义

将用户名中的@转义为%40即可避开解析规则冲突,该方法兼容性最好,适配所有版本的go-sql-driver/mysql驱动。
修复后的示例代码:

// 原用户名root@proxy转义为root%40proxy
db, err := sql.Open("mysql", "root%40proxy@tcp(172.21.30.22:3306)/your_db_name")

方案2:显式声明空密码

在用户名后加冒号:明确标识密码段为空,即可让解析器正确识别到第二个@才是凭证和地址的分隔符,该方法无需修改用户名格式,适配v1.5.0及以上版本的go-sql-driver/mysql驱动。
修复后的示例代码:

// 用户名后加:显式声明密码为空
db, err := sql.Open("mysql", "root@proxy:@tcp(172.21.30.22:3306)/your_db_name")

内容的提问来源于stack exchange,提问作者翁海星

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:54:02