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; - 如果表已经创建好了,直接修改目标字段的字符集:
把threads和user表中需要存Emoji的字段也按这个方式修改。ALTER TABLE `replyes` MODIFY COLUMN `content` TEXT CHARACTER SET utf8mb4 COLLATE=utf8mb4_unicode_ci;
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
相关产品推荐
相关产品推荐

