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

如何解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 20:33:09