如何在Flask-SQLAlchemy中设置utf8mb4字符集避免pymysql 1366错误
方案1:单字段指定字符集(符合你要求的在Column定义时直接配置)
直接在声明MEDIUMTEXT类型时传入charset和collation参数即可,修改你的字段定义为:
content_text = db.Column(MEDIUMTEXT(charset='utf8mb4', collation='utf8mb4_unicode_ci'), nullable=False)
这个配置会在生成表结构时自动给content_text字段加上utf8mb4字符集和对应排序规则,不需要额外执行ALTER语句。
方案2:表级全局配置(推荐,适合表内有多个字符串字段的场景)
给模型类增加__table_args__属性,配置整个表的默认字符集,所有字符串类型字段会自动继承该配置:
class Email(db.Model): __tablename__ = 'email' # 表级字符集配置 __table_args__ = { 'mysql_charset': 'utf8mb4', 'mysql_collate': 'utf8mb4_unicode_ci' } id = db.Column(db.Integer, primary_key=True) # 字段不需要单独配置,自动继承表级字符集 content_text = db.Column(MEDIUMTEXT, nullable=False)
生效验证
修改完成后,删除之前生成的migrations目录,重新执行迁移流程:
FLASK_APP=test_schema.py flask db init FLASK_APP=test_schema.py flask db migrate FLASK_APP=test_schema.py flask db upgrade
执行后查看表结构,就能看到表和字段的字符集已经自动设置为utf8mb4,插入特殊字符不会再报错。
补充建议
你当前的测试库默认字符集为latin1,建议修改数据库默认字符集,避免后续新建表重复配置:
ALTER DATABASE test DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
你之前配置的连接串已经加了charset=utf8mb4参数,这个配置是正确的,保留即可。
内容的提问来源于stack exchange,提问作者Peter Moore
相关产品推荐
相关产品推荐

