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
相关产品推荐
相关产品推荐

