如何解决 MySQL 连接中密码含特殊字符(如 @)导致的 URL 解析错误
技术百科
碧海醫心
发布时间:2026-01-27
浏览: 次 当 mysql 数据库密码包含 `@`、`/`、`:` 等 url 保留字符时,sqlalchemy 的连接字符串会解析失败,报错 `getaddrinfo failed`;正确做法是使用 `urllib.parse.quote_plus()` 对密码进行 url 编码。
在使用 SQLAlchemy(配合 PyMySQL 或 mysqlclient)连接 MySQL 数据库时,连接字符串格式为:
mysql+driver://username:password@host:port/database
该字符串本质上是一个 URL,因此其中的 username、password、host 和 database 都需满足 URL 编码规范。若密码中包含 @(如 'Gspann@123'),URL 解析器会误将 @ 后的内容识别为 host 地址,导致实际解析出错——例如把 Gspann@123 中的 @123 当作主机名的一部分,从而触发 getaddrinfo failed(错误码 Errno 11003),最终连接失败。
✅ 正确解决方案:对敏感字段(尤其是密码)进行 URL 编码。推荐仅编码 password 字段(因其最常含特殊字符),使用 Python 标准库 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_recycle 和 echo=False 用于生产环境)
db_connection = create_engine(
db_connection_str,
pool_recycle=3600, # 防止 MySQL 默认 8 小时断连
echo=False # 生产环境关闭 SQL 日志输出
)
# 执行查询
df = pd.read_sql("SELECT * FROM vw_dv_count_rpt", con=db_connection)
print(df.head())⚠️ 注意事项:
- 不要手动替换 @ 为 %40 等编码值——quote_plus 更可靠(它还会处理空格、+、/ 等,并统一转为 %xx 格式);
- 若用户名或数据库名也含特殊字符(罕见但可能),同样需分别编码;
- 确保已安装依赖:pip install pymysql sqlalchemy pandas;
- 避免在代码中硬编码密码,推荐改用环境变量(如 os.getenv("DB_PASSWORD"))或密钥管理服务;
- 连接失败时,优先检查网络可达性(如 ping 35.187.1
58.251 或 telnet 35.187.158.251 3306),再排查 URL 编码问题。
通过规范编码密码,可彻底规避因 URL 解析歧义引发的连接异常,确保数据库连接稳定可靠。
# ai
# 是一个
# 还会
# 尤其是
# python
# 错误码
# 本质上
# 因其
# 最常
# word
# 环境变量
# 编码
# 标准库
# 字符串
# 数据库
# 报错
# 特殊字符
# mysql
# database
# pandas
# errno
# 格式为
# pip
相关栏目:
<?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内存溢出怎么排查_php内存限制调试与优化方
- 如何使用Golang实现微服务事件驱动_使用消息总
- 如何使用Golang捕获测试日志_Golang t
- 如何在 Laravel 中通过嵌套关联关系进行 o
- Mac如何整理桌面文件_Mac使用堆栈功能一键整理
- Python与OpenAI接口集成实战_生成式AI
- 如何用正则表达式精确匹配“start”到“end”
- Win11怎么设置默认终端应用_Windows11
- 小程序里php怎么变mp4_小程序调用php生成m
- php错误怎么开启_display_errors与
- Win11怎么关闭资讯和兴趣_Windows11任
- Windows执行文件被SmartScreen拦截
- php转exe用什么工具打包快_高效打包软件推荐【
- Linux如何安装Golang环境_Linux下G
- Win11如何设置鼠标灵敏度_Win11鼠标灵敏度
- Win11怎么设置虚拟内存最佳大小_Windows
- Win11视频默认播放器怎么改_Win11关联第三
- Win11怎么更改任务栏颜色_Windows11个
- 如何在Golang中编写端到端测试_Golang
- Win11怎么查看wifi信号强度_检测Windo
- Python抽象类与接口设计_规范说明【指导】
- Win11怎么设置指纹解锁 Win11笔记本录入指
- c# 如何用c#实现一个支持优先级的任务队列
- Windows 11无法安全删除U盘提示设备正在使
- mac怎么安装adb_MAC配置Android A
- PHP cURL GET请求:正确设置认证与自定义
- 如何在Golang中实现邮件发送功能_Golang
- mac本地php环境如何开启curl_curl扩展
- Win10如何备份注册表_Win10注册表备份步骤
- WindowsUSB驱动安装异常怎么办_USB驱动
- 短链接怎么用php还原_从基础原理到代码实现教学【
- php命令行怎么运行_通过CLI模式执行PHP脚本
- c++ stringstream用法详解_c++字
- Windows10系统服务优化指南_Win10禁用
- c++如何利用doxygen生成开发文档_c++
- Windows10电脑怎么设置文件权限_Win10
- Windows任务计划服务异常原因_任务调度失败的
- Win11怎么关闭小组件_Win11禁用任务栏天气
- Win11怎么制作U盘启动盘_Win11原版系统安
- 如何在Mac上搭建Golang开发环境_使用Hom
- 如何处理“XML格式不正确”错误 常见XML we
- C++如何将C风格字符串(char*)转换为std
- 如何在Golang中编写异步函数测试_Golang
- 如何使用Golang实现基本类型比较_Golang
- Win11如何设置开机问候语 Win11修改登录界
- PHP 中如何在函数内持久修改引用变量所指向的目标
- Win11怎么更改默认打开方式_Win11关联文件
- Mac的访达(Finder)怎么用_Mac文件管理
- Win11任务栏颜色怎么改_Win11自定义任务栏
- Windows怎样关闭Edge新标签页广告_Win


QQ客服