如何解决Flask应用连接MySQL数据库的字符编码问题
Flask+MySQL 查询数据网页乱码,执行
SET NAMES CP850无效问题 我正在开发一个基于Python Flask和MySQL的项目,通过cursor.execute()查询数据库数据后,网页渲染输出时出现乱码:

经调试确认乱码源自数据库端,在HeidiSQL中执行SET NAMES CP850;后,查询数据显示正常,但重启会话后乱码再次出现,说明需要在每次会话开始时执行该命令。
我尝试在Python脚本创建连接对象后执行SET NAMES CP850;,但网页乱码问题仍未解决。以下是我的数据库连接代码:
def intentar_conexión(nombre_usuario, contraseña): try: return mysql.connector.connect( user=nombre_usuario, password=contraseña, host="localhost", database="bienestar" ) except mysql.connector.Error as err: print("[Debug Message] MySQL Error: " + str(err)) return err.errno
我的Python环境使用utf-8编码,脚本中的带重音元音及ñ字符显示正常。
解决方法
1. 连接时直接指定字符集参数
mysql.connector.connect()支持直接通过参数指定连接字符集,比手动执行SET NAMES更可靠——它会同步设置character_set_client、character_set_connection和character_set_results三个核心参数,避免因执行时机不当导致的失效问题。
修改连接代码,添加charset='cp850'参数:
def intentar_conexión(nombre_usuario, contraseña): try: return mysql.connector.connect( user=nombre_usuario, password=contraseña, host="localhost", database="bienestar", charset='cp850' # 新增字符集指定 ) except mysql.connector.Error as err: print("[Debug Message] MySQL Error: " + str(err)) return err.errno
2. 确保连接后立即执行SET NAMES(备选方案)
若指定charset参数无效,需保证在创建连接后、生成cursor前立即执行字符集命令,且每个新连接都要执行:
def intentar_conexión(nombre_usuario, contraseña): try: conn = mysql.connector.connect( user=nombre_usuario, password=contraseña, host="localhost", database="bienestar" ) # 连接创建后立刻执行字符集设置 cursor = conn.cursor() cursor.execute("SET NAMES CP850;") conn.commit() cursor.close() return conn except mysql.connector.Error as err: print("[Debug Message] MySQL Error: " + str(err)) return err.errno
3. 检查数据库/表的字符集一致性
如果上述方法仍无效,需确认数据库和表的存储字符集是否为CP850:
- 查看数据库字符集:
SHOW CREATE DATABASE bienestar; - 查看表字符集:
SHOW CREATE TABLE tu_tabla;
若存储字符集与连接字符集不一致,需修改数据库或表的字符集:
ALTER DATABASE bienestar CHARACTER SET cp850; ALTER TABLE tu_tabla CONVERT TO CHARACTER SET cp850;
补充说明
Python环境使用UTF-8、Flask默认UTF-8渲染网页是正常的,只要数据库连接字符集与存储字符集匹配,查询到的数据会被正确转换,最终在网页上正常显示。
内容的提问来源于stack exchange,提问作者user25821995
相关产品推荐
相关产品推荐

