如何解决 MySQL 连接中密码含 @ 符号导致的 URL 解析错误
技术百科
花韻仙語
发布时间:2026-01-27
浏览: 次 当数据库密码包含特殊字符(如 @)时,sqlalchemy 的连接字符串会将其误识别为 url 中的用户名/主机分隔符,从而引发 `getaddrinfo failed` 等连接异常;正确做法是使用 `urllib.parse.quote_plus()` 对密码进行 url 编码。
在使用 SQLAlchemy(配合 PyMySQL 或 MySQLdb)构建 MySQL 连接字符串时,格式通常为:
mysql+pymysql://
该格式严格遵循 URL 规范,因此所有特殊字符(尤其是 @、/、:、?、# 等)都必须进行百分号编码(URL-encoding),否则解析器会错误截断凭证信息。例如,密码 Gspann@123 中的 @ 会被误认为是用户与主机之间的分隔符,导致主机地址被解析为 Gspann@123@35.187.158.251,最终触发 Can't connect to MySQL server on 'Gspann@123@35.187.158.251' 类似错误。
✅ 正确解决方案:对密码(及用户名,如含特殊字符)调用 urllib.parse.quote_plus() 进行编码:
from urllib.parse import quote_plus
from sqlalchemy import create_engine
import pandas as pd
# 安全编码密码(自动处理 @ / : 等字符)
password = "Gspann@123"
encoded_password = quote_plus(password)
db_connection_str = f"mysql+pymysql://beat_dq_readonly:{encoded_password}@35.187.158.251/beat_results_dev"
# 创建引擎(建议添加 pool_pre_ping=True 提升健壮性)
db_connection = create_engine(db_connection_str, pool_pre_ping=True)
# 执行查询
df = pd.read_sql("SELECT * FROM vw_dv_count_rpt", con=db_connection)
print(df.head())⚠️ 注意事项:
- 不要手动替换 @ 为 %40 —— quote_plus() 比 quote() 更适合密码场景(它将空格转为 +,且编码更全面);
- 若用户名也含特殊字符(如 user@domain),同样需编码;
- 生产环境请避免硬编码密码,推荐使用环境变量(如 os.get
env("DB_PASSWORD"))或密钥管理服务;
- 首次连接失败时,可加 echo=True 参数(create_engine(..., echo=True))查看实际生成的连接 URL,辅助调试。
总结:URL 中的认证信息必须严格符合 RFC 3986 规范。只要涉及非字母数字字符,就应通过 quote_plus() 编码——这是 SQLAlchemy 连接 MySQL / PostgreSQL 等数据库时保障连接字符串鲁棒性的关键实践。
# ai
# 将其
# 这是
# 尤其是
# 推荐使用
# 首次
# word
# 环境变量
# 编码
# 字符串
# 数据库
# 特殊字符
# echo
# mysql
# postgresql
# 分隔符
# database
# 更适合
# 它将
# 都必须
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 短链接怎么用php递归还原_多层加密链接的处理法【
- Win11怎么关闭自动调节亮度_Windows11
- Mac如何彻底清理浏览器缓存?(Safari与Ch
- 如何使用Golang实现路由参数绑定_使用Mux和
- Win10路由器怎么隐藏ssid Win10隐藏w
- 如何使用Golang包导出规则_控制函数和变量可见
- 如何使用Golang搭建Web开发环境_快速启动H
- PHP怎么接收前端传的时间戳_处理时间戳参数转换技
- Windows笔记本无法进入睡眠模式怎么办?(电源
- Win11怎么关闭搜索历史_Win11清除任务栏搜
- php修改数据怎么改富文本_update更新htm
- 如何在Golang中编写异步函数测试_Golang
- 微信JSAPI支付回调PHP怎么接收_处理JSAP
- Windows11怎么自定义任务栏_Windows
- Python高性能计算项目教程_NumPyCyth
- 如何在Golang中修改数组元素_通过指针实现原地
- Windows服务无法启动错误1067是什么_进程
- Win11怎么激活Windows10_Win11激
- C++如何解析JSON数据?(nlohmann/j
- Win11怎么退出高对比度模式_Win11取消反色
- Win11怎样安装钉钉客户端_Win11安装钉钉教
- php中常量能用::访问吗_类常量与作用域操作符使
- c# await 一个已经完成的Task会发生什么
- 如何在 Go 中高效缓存与分发网络视频流
- PHP接收参数值为空怎么办_判断和处理空参数方法说
- 如何使用正则表达式提取以编号开头、后跟多个注解的完
- Windows10如何更改桌面背景_Win10个性
- 如何使用Golang实现容器自动化运维_Golan
- php485支持哪些操作系统_php485跨系统支
- Win11怎么关闭自动修复_跳过Win11开机自动
- 如何使用Golang table-driven f
- php打包exe如何加密代码_防反编译保护方法【技
- 如何在 Go 中正确反序列化 XML 多节点数组(
- Win11怎样安装剪映专业版_Win11安装剪映教
- 如何在Windows中创建新的用户账户?(标准与管
- Python抽象类与接口设计_规范说明【指导】
- Win11色盲模式怎么开_Win11屏幕颜色滤镜设
- 如何在 Go 项目开发中正确处理本地包导入与远程模
- Windows 11怎么更改锁屏超时时间_Wind
- 如何解决Windows字体显示模糊的问题?(Cle
- 一文教你快速开通网站LOGO图
- 如何在Golang中定义接口_抽象方法和多态实现
- 如何在Golang中实现服务熔断与限流_Golan
- php8.4xdebug无法调试怎么办_php8.
- Win11文件扩展名怎么显示 Win11查看文件后
- 如何使用Golang defer优化性能_减少不必
- XAMPP 启动失败(Apache 突然停止)的终
- Win10任务栏天气和资讯怎么关闭 Win10禁用
- c++中explicit(bool)的用法 c++
- LINUX怎么设置系统语言_LINUX修改中文环境


QQ客服