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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 19:57:04