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

Python 3.6.2+Scrapy项目存储含Emoji长字符串到MySQL的问题

解决Scrapy中含Emoji字符串存入MySQL的问题

嘿,我来帮你搞定这个带Emoji的长字符串存MySQL的麻烦!从你给出的信息来看,核心问题就出在字符集的支持上——MySQL默认的utf8只支持3字节的字符,而Emoji是4字节的,必须用utf8mb4才能完整存储。我给你一步步梳理解决方案:

1. 彻底把数据库、表、字段切换到utf8mb4

你已经写了修改数据库默认字符集的语句,但这只是第一步,现有表和字段的字符集可能还停留在utf8,得逐个更新:

  • 先确保你执行了这条语句,把数据库默认字符集改成utf8mb4:
    ALTER SCHEMA `testdb` DEFAULT CHARACTER SET utf8mb4
    
  • 对于涉及存储Emoji的表(replyes、threads、user),建表时必须指定CHARSET=utf8mb4。比如replyes的建表语句应该改成这样(补全你没写完的部分):
    CREATE TABLE `replyes` (
        id INT AUTO_INCREMENT PRIMARY KEY,
        content TEXT NOT NULL, -- 假设这是存长文本和Emoji的字段
        thread_id INT,
        user_id INT,
        -- 其他字段...
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
    
  • 如果表已经创建好了,直接修改目标字段的字符集:
    ALTER TABLE `replyes` MODIFY COLUMN `content` TEXT CHARACTER SET utf8mb4 COLLATE=utf8mb4_unicode_ci;
    
    把threads和user表中需要存Emoji的字段也按这个方式修改。

2. 配置Scrapy的数据库连接为utf8mb4

就算数据库端设置对了,如果Scrapy连接数据库时用的还是utf8编码,照样存不了Emoji。假设你用pymysql连接数据库,在Pipeline的连接初始化里一定要加上charset='utf8mb4'参数:

import pymysql
from scrapy.exceptions import DropItem

class MySQLPipeline:
    def open_spider(self, spider):
        self.conn = pymysql.connect(
            host='你的数据库地址',
            user='用户名',
            password='密码',
            db='testdb',
            charset='utf8mb4',  # 关键参数!
            cursorclass=pymysql.cursors.DictCursor
        )
        self.cursor = self.conn.cursor()

    # 其他存数据的方法...

3. 别手动编码字符串

Python 3.6+默认用Unicode字符串,Scrapy爬取到的响应内容也都是Unicode格式,所以你直接把字符串传给数据库就行,不要手动调用encode('utf-8'),否则反而会导致编码错误。

4. 验证存储结果

存完数据后,你可以直接在MySQL客户端里查询,或者用Python读取出来打印,检查Emoji是否正常显示。如果还是乱码,再排查这几点:

  • 数据库连接的charset参数是不是真的设成了utf8mb4
  • 表和字段的字符集有没有确认修改成功
  • 你用的MySQL客户端(比如Navicat、MySQL Workbench)是不是也设置了utf8mb4编码连接

内容的提问来源于stack exchange,提问作者itsmnthn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:49:37