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

SQLAlchemy连接MySQL获取字符集错误 已尝试多种配置未解决求方案

Flask-SQLAlchemy多库绑定场景下MySQL查询乱码可行解决方案

问题根因

你遇到的乱码是典型的UTF-8编码字节流被错误按照CP1252/ISO-8859-1编码解码导致的字符溢出问题,之前的方案失效核心原因是使用SQLALCHEMY_BINDS声明多数据源时,全局配置的字符集参数不会自动应用到单独绑定的MySQL数据源,且你之前用到的MYSQL_CHARSET类配置属于Flask-MySQL扩展的专用参数,对Flask-SQLAlchemy无效。

可行修复步骤

1. 针对MySQL绑定源单独配置连接参数

首先在SQLALCHEMY_BINDS配置中给MySQL连接URI添加charset=utf8mb4后缀,再通过SQLAlchemy事件监听器强制MySQL连接初始化时设置会话字符集,不会影响已绑定的两个SQL Server数据源:

# 原有多数据源绑定配置,仅修改MySQL对应的URI
app.config['SQLALCHEMY_BINDS'] = {
    # 两个SQL Server绑定配置保留不变
    'mssql_db1': 'mssql+pymssql://user:pass@host1/db1',
    'mssql_db2': 'mssql+pymssql://user:pass@host2/db2',
    # MySQL绑定添加charset参数
    'mysql_db': 'mysql+pymysql://user:pass@mysql_host/mysql_db?charset=utf8mb4'
}

# 新增连接事件监听器
from sqlalchemy import event
from sqlalchemy.engine import Engine

@event.listens_for(Engine, "connect")
def force_mysql_charset(dbapi_connection, connection_record):
    # 仅针对MySQL连接执行字符集设置,避免影响SQL Server连接
    driver_name = connection_record._dbapi_connection.dbapi.__name__
    # 若使用mysqlclient驱动,将下方'pymysql'替换为'MySQLdb'即可
    if driver_name == 'pymysql':
        cursor = dbapi_connection.cursor()
        cursor.execute("SET NAMES 'utf8mb4' COLLATE 'utf8_general_ci'")
        cursor.execute("SET character_set_client = utf8mb4, character_set_results = utf8mb4, character_set_connection = utf8mb4")
        cursor.close()

2. 清理无效配置

删除以下之前添加的无效配置,避免参数冲突:

  • 所有app.config['MYSQL_CHARSET']、app.config['MYSQL_DATABASE_CHARSET']相关配置
  • 初始化SQLAlchemy时传入的use_native_unicode参数(该参数在SQLAlchemy 1.4+已废弃,且仅对全局默认引擎生效)

3. 验证修复效果

重启服务后直接查询MySQL字符串字段,无需再手动执行mystring.encode('cp1252').decode('utf8')即可得到正确编码的字符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 18:15:01