Python编码错误求助:爬虫执行MySQL SQL语句时触发报错
解决爬虫MySQL编码问题的实用方案
Hey there! As a 3-month Python newbie tackling crawlers, encoding issues with MySQL can feel super frustrating—let’s walk through the most common fixes for this problem:
1. 数据库连接时强制指定编码
MySQLdb默认的编码可能和你爬取的内容不匹配,在建立连接时一定要明确指定charset参数,推荐用utf8mb4(比标准utf8支持更多字符,比如emoji):
import MySQLdb conn = MySQLdb.connect( host="你的数据库地址", user="用户名", passwd="密码", db="数据库名", charset="utf8mb4" )
2. 正确处理爬取内容的编码
爬虫获取的网页内容编码五花八门,先检测再转码是关键:
- 可以用
chardet库自动识别编码:
import requests import chardet response = requests.get("目标网页链接") # 检测内容编码 detected_encoding = chardet.detect(response.content)["encoding"] # 解码为Unicode再转成utf-8(用errors="replace"处理无法识别的字符) clean_content = response.content.decode(detected_encoding, errors="replace").encode("utf-8")
- 如果
requests自动识别的编码没问题,也可以直接用response.text(它会自动解码),再转成utf-8存储。
3. 用参数化查询替代字符串拼接
绝对不要手动拼接SQL语句!这不仅会引发编码问题,还会有SQL注入风险。改用参数化查询:
# 错误示例:字符串拼接(极易出编码问题) # sql = f"INSERT INTO produtos (nome, descricao) VALUES ('{produto_nome}', '{produto_desc}')" # 正确示例:参数化查询 sql = "INSERT INTO produtos (nome, descricao) VALUES (%s, %s)" cursor.execute(sql, (produto_nome, produto_desc))
MySQLdb会自动处理参数的编码转换,避免乱码或报错。
4. 检查数据库表的编码设置
确保你的数据表和字段使用的是utf8mb4编码:
- 创建表时指定编码:
CREATE TABLE produtos ( id INT AUTO_INCREMENT PRIMARY KEY, nome VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci, descricao TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci );
- 如果表已存在,修改编码:
ALTER TABLE produtos CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
如果以上方法还没解决问题,把完整的报错信息贴出来(你提供的报错截断了),可以更精准地定位问题!
内容的提问来源于stack exchange,提问作者Thiago Bueno
相关产品推荐
相关产品推荐

