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

Docker部署MySQL/Flask/Nginx时SQL数据UTF-8显示乱码求助

解决方案:解决数据库读取特殊字符(ü)显示为ü的问题

你的问题是典型的编码不匹配导致的乱码:ü作为UTF-8编码(占2字节:C3 BC),被当成Latin-1解码就会变成ü。你已经配置了MySQL服务器和数据库的编码,但遗漏了最关键的数据库连接编码和字段级编码设置,以下是具体解决步骤:

1. 修改Python数据库连接,强制指定UTF-8编码

不管你用的是pymysql还是mysql-connector-python,在建立连接时必须明确指定字符集为utf8mb4(比utf8支持更多特殊字符,推荐使用):

示例(pymysql):

import pymysql
connection = pymysql.connect(
    host='mysql',
    user='your_user',
    password='your_password',
    db='db',
    charset='utf8mb4',  # 关键参数
    cursorclass=pymysql.cursors.DictCursor
)

示例(mysql-connector-python):

import mysql.connector
connection = mysql.connector.connect(
    host='mysql',
    user='your_user',
    password='your_password',
    database='db',
    charset='utf8mb4'  # 关键参数
)

这一步是核心:如果连接时不指定编码,Python会使用MySQL服务器的默认连接编码(可能是latin1),导致读取数据时编码转换错误。

2. 确保数据库字段的编码为UTF-8

你之前修改了数据库和表的字符集,但字段本身的编码可能还是默认的latin1,需要单独修改字段:

ALTER TABLE example MODIFY ExampleText varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;

更新你的初始化SQL文件,直接在创建表时指定字段编码:

ALTER DATABASE db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

USE db;

CREATE TABLE example(
    ExampleID int NOT NULL AUTO_INCREMENT,
    ExampleText varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,  # 字段级编码
    PRIMARY KEY (ExampleID)
);

INSERT INTO example(ExampleText) VALUES("ü");

3. 确保SQL初始化文件的编码为UTF-8

  • 检查你的SQL文件保存时的编码是否为UTF-8(不要用ANSI/Latin-1)
  • 如果是通过Docker初始化数据库,在SQL文件开头添加编码声明:
    SET NAMES utf8mb4;
    SET CHARACTER SET utf8mb4;
    

验证步骤

  1. 进入MySQL容器,执行以下命令检查编码:

    SHOW VARIABLES LIKE 'character_set_%';
    SHOW VARIABLES LIKE 'collation_%';
    DESCRIBE example;
    

    确保character_set_connection、character_set_results、character_set_client都是utf8mb4,字段ExampleText的字符集是utf8mb4。

  2. 在Python代码中打印读取到的value[0]的编码,确认是UTF-8字符串:

    print(type(value[0]))
    print(value[0].encode('utf-8'))  # 应该输出b'\xc3\xbc'
    

内容的提问来源于stack exchange,提问作者Franz Müller

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 05:22:27