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;
验证步骤
进入MySQL容器,执行以下命令检查编码:
SHOW VARIABLES LIKE 'character_set_%'; SHOW VARIABLES LIKE 'collation_%'; DESCRIBE example;确保
character_set_connection、character_set_results、character_set_client都是utf8mb4,字段ExampleText的字符集是utf8mb4。在Python代码中打印读取到的
value[0]的编码,确认是UTF-8字符串:print(type(value[0])) print(value[0].encode('utf-8')) # 应该输出b'\xc3\xbc'
内容的提问来源于stack exchange,提问作者Franz Müller
相关产品推荐
相关产品推荐

