Mysql数据库导出为csv或excel文件 中文乱码解决方法:用TaoToken统一Key打通导出脚本配置 1. 从一次报表导出翻车说起中文为什么成了问号Mysql 数据库导出为 csv 或 excel 文件时中文乱码是批量报表场景里出现频率极高的一类问题。你写好了 Python 脚本连上库、查完数据、to_csv一落盘用 Excel 双击打开原本的「原始诗歌」「作者简介」全变成了????、推è、ç«‹这种看不懂的字符。数据没丢但没法交付。这个问题的本质不是 Mysql 坏了也不是 pandas 写错了而是字符集在链路上被换了三次数据库连接层、Python 内存层、文件落盘层最后还有 Excel 打开时的解码层。任何一层没对齐中文就会碎掉。适合谁看需要定期从 Mysql 批量导出报表、又不想每次手动「数据→导入」的开发者以及正在用 AI 辅助生成导出脚本、但生成结果总在编码上翻车的人。我试过的排查路径是这样的先确认库里存的是不是真 UTF-8再看连接参数有没有写charset然后看to_csv的encoding最后看 Excel 用什么编码去读。四步里最容易被忽略的是第一步和第四步——很多人一上来就改to_csv结果库本身是latin1怎么改都白搭。下面把每一步都拆成可复制的配置并用 TaoToken 统一 Key 把 AI 辅助生成与校验这一段接进来让脚本骨架和排障建议能一次性拿到。2. 前置准备用 TaoToken 统一 Key 打通脚本生成与校验在动手改编码之前先把「写脚本」这件事提速。TaoToken 是一个统一的大模型 API 接入通道一个 Key 就能调用多种模型适合用来生成导出脚本骨架、解释报错、校验字符集参数。官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 这个不加 UTM。你需要先拿到 Key进入控制台 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 在 API Keys 页面创建一个密钥地址是 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。创建后复制保存后面脚本里会用到。如果你只是想先验证模型能不能正常返回中文可以直接用模型对话页面 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 试一句「帮我写一个 pymysql 连接时指定 utf8mb4 的示例」看返回是否正常。长期做编码类脚本、Agent 辅助排障的可以看 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 把生成、校验、改写串成固定流程。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite Claude Code 相关配置在 https://taotoken.net/claudecode?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecodeutm_campaignrewrite 。注意TaoToken 在这里的角色是「帮你生成和校验脚本配置的 AI 通道」不是数据库工具也不替代你的编辑器。导出动作仍然由你本地的 Python 脚本完成。3. 可复制配置Mysql 导出 csv/excel 的字符集骨架3.1 连接层pymysql 必须显式指定 charset很多乱码的根因在连接层。pymysql.connect如果不写charset默认可能走latin1读出来的中文在内存里就已经是坏的了。正确写法是显式指定utf8mb4import pymysql conn pymysql.connect( hostlocalhost, userroot, passwordyour_password, databasepoems, charsetutf8mb4, # 关键连接层字符集 cursorclasspymysql.cursors.DictCursor )同时确认库和表的字符集。执行下面这条 SQL看character_set_*是否都是utf8mb4SHOW VARIABLES LIKE character_set%; SHOW CREATE TABLE yuan_shi;如果表还是latin1要么改表要么在查询时用CONVERT转换但最稳的还是把库表统一成utf8mb4。3.2 落盘层to_csv 的 encoding 与 BOMpandas 的to_csv默认encodingutf-8但 Excel 在 Windows 上双击打开 csv 时默认按本地编码GBK解码于是 UTF-8 的中文就花了。两种解法第一种写utf-8-sig也就是带 BOM 的 UTF-8Excel 能识别import pandas as pd df pd.DataFrame(columnsname, dataresults_list) df.to_csv(D:/yuan_shi.csv, encodingutf-8-sig, indexFalse)第二种写gbk适合确定只在中文 Windows 环境打开的场景df.to_csv(D:/yuan_shi.csv, encodinggbk, indexFalse)追加写入时同理open的encoding要和首次写入保持一致否则同一个文件里混了两种编码更乱import csv with open(D:/yuan_shi.csv, a, encodingutf-8-sig, newline) as f: writer csv.writer(f) writer.writerows(results)3.3 导出 excel 的写法如果目标直接是 xlsx用to_excel它内部走的是二进制格式不存在 csv 那种「Excel 按本地编码猜」的问题中文一般不会乱df.to_excel(D:/yuan_shi.xlsx, indexFalse, engineopenpyxl)需要装openpyxlpip install openpyxl。实测下来xlsx 路线比 csv 路线省心代价是文件大一些、写入慢一些。3.4 用 TaoToken 生成并校验这段骨架把上面的需求丢给 TaoToken 的模型对话提示词可以这样写请生成一个 Python 脚本用 pymysql 连接 Mysqlcharsetutf8mb4 查询 yuan_shi 表全部数据用 pandas 导出为 csv 要求 encodingutf-8-sig支持文件不存在时新建、存在时追加。 并指出哪些参数会影响中文乱码。拿到返回后重点核对三处连接charset、to_csv的encoding、追加时open的encoding是否一致。这三处对齐乱码基本就没了。如果模型给的还是utf-8手动改成utf-8-sig再跑。4. 验证请求用乱码样例文件确认中文正常改完配置别急着交付先做一次验证。准备一个已知会乱码的样例用旧脚本encodingutf-8导出一份 csv双击打开确认是乱码记下乱码形态。然后用新脚本重新导出对比。验证脚本可以这样写直接打印前几行并检查编码import pandas as pd # 读取时显式指定编码避免 pandas 猜错 df pd.read_csv(D:/yuan_shi.csv, encodingutf-8-sig) print(df.head()) print(df.columns.tolist()) # 检查是否还有替换字符 bad df.astype(str).apply(lambda col: col.str.contains(\ufffd)).any().any() print(存在乱码替换字符:, bad)如果bad为False且head()里中文正常显示说明落盘和读取这一环通了。再用 Excel 双击打开一次确认表头和数据行都是中文没有????。如果你走的是「Excel 手动导入」路线动作是新建 Excel → 数据 → 从文本/CSV → 选择文件 → 在导入向导里把「文件原始格式」选成65001: Unicode (UTF-8)→ 加载。这一步能救回已经导出的 UTF-8 文件但每次手动点很烦所以更推荐在脚本层直接写utf-8-sig。5. 本篇常见错排查5.1 连接没写 charset内存里就坏了现象to_csv已经写了utf-8-sig打开还是乱。原因pymysql.connect缺charsetutf8mb4读出来就是坏字节后面怎么编码都救不回。排查在查询后直接print(results[0])看内存里中文是否正常。5.2 追加写入编码不一致现象首次写入正常追加后文件里一部分正常一部分乱。原因首次用utf-8-sig追加用utf-8或者反过来。排查统一两处encoding建议都用utf-8-sig。5.3 文件不存在直接追加报错现象FileNotFoundError。原因a模式在部分环境下不会自动建文件。排查追加前先判断文件是否存在不存在就先写表头import os if not os.path.exists(D:/yuan_shi.csv): df.to_csv(D:/yuan_shi.csv, encodingutf-8-sig, indexFalse) else: with open(D:/yuan_shi.csv, a, encodingutf-8-sig, newline) as f: writer csv.writer(f) writer.writerows(results)5.4 库表本身是 latin1现象连接和落盘都对了还是乱。原因表字符集是latin1存进去时就已经转坏。排查SHOW CREATE TABLE yuan_shi;看CHARSET。处理ALTER TABLE yuan_shi CONVERT TO CHARACTER SET utf8mb4;操作前备份。5.5 Excel 版本差异导致 utf-8 仍乱现象utf-8-sig在部分老版本 Excel 里仍乱。原因老版本对 BOM 识别不一致。处理改用gbk导出或直接走 xlsx。排查换一台机器或换 WPS 打开对比。遇到拿不准的报错可以把错误栈贴到 TaoToken 模型对话里让它结合你的连接参数和to_csv配置给出定位建议接入细节查接入文档Key 管理在 API Keys 页面。6. 把导出流程固定下来从脚本到 AI 校验的闭环中文乱码这件事单次修好不难难的是每次导出都不再犯。我的做法是把「连接 charset、落盘 encoding、追加 encoding」三处写进脚本模板任何新导出任务都从这个模板改不重新手写。然后用 TaoToken 统一 Key 做两件事一是生成新表的导出脚本骨架二是把报错和乱码样例丢进去做校验让它指出哪一层编码没对齐。模型对话适合快速验证「这段配置对不对」Coding Plan 适合把生成、校验、改写串成长期流程接入文档和 API Keys 则是每次配置时的固定入口。导出脚本本身不复杂复杂的是链路上每一层都别掉链子。把模板固化、把校验交给 AI 通道下次再遇到????你至少知道从哪一层开始查。