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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:32:31