VSCode本身不读数据库,中文乱码实际源于数据库客户端输出及终端/运行环境编码不匹配;需先区分是终端输出乱码(查print("测试中文"))、数据库查询乱码(查cursor.fetchall())还是SQL文件打开乱码(状态栏切换编码),再分别配置终端环境、数据库连接charset/client_encoding及文件编码。

VSCode 本身不直接“读取数据库”,你看到的中文乱码,实际来自数据库客户端(比如 Python 的 sqlite3、pymysql、psycopg2,或 Node.js 的 mysql2、pg 等)执行查询后,在 VSCode 集成终端(Terminal)或调试控制台(Debug Console)中输出的结果。问题根子不在 VSCode 编辑器界面,而在「数据库连接层的字符集配置」和「终端/运行环境的编码设定」两处。
确认是终端输出乱码,不是文件或编辑器乱码
先排除干扰:打开一个空的 .py 文件,写一行 print("测试中文"),在 VSCode 终端里运行。如果这行也乱码,说明是终端环境问题;如果这行正常,但连接数据库后 cursor.fetchall() 输出的是 b'\xe4\xb8\xad\xe6\x96\x87' 或一堆问号/方块,那才是数据库链路的问题。
- 终端本身乱码 → 调整
terminal.integrated.env.*和系统代码页(Windows)或 locale(Linux/macOS) - 数据库查询结果乱码 → 检查连接时是否显式指定了
charset/client_encoding - VSCode 编辑器里打开的 SQL 文件显示乱码 → 和数据库无关,是文件编码问题,按状态栏切换即可
MySQL 连接必须显式设 charset='utf8mb4'
Python + pymysql 或 mysql-connector-python 是最常见出问题的组合。它们默认不继承系统编码,也不自动协商 UTF-8,尤其在 Windows 上容易 fallback 到 gbk。
-
pymysql.connect(..., charset='utf8mb4')—— 必须写,不能省略 -
mysql-connector-python要加charset='utf8mb4'且推荐同时设collation='utf8mb4_unicode_ci' - 只写
charset='utf8'不够:MySQL 的utf8实际是阉割版(不支持 emoji 和部分生僻汉字),必须用utf8mb4 - 如果数据库建表时用的是
gbk,那连接时也得配charset='gbk',但强烈建议把库和表都迁移到utf8mb4
PostgreSQL 要设 client_encoding='UTF8'
psycopg2 默认会尝试从环境变量读 LANG,但在 VSCode 终端里这个值常为空或错,导致连接后 SELECT '中文' 返回乱码或报错。
- 连接时传参:
psycopg2.connect(..., options='-c client_encoding=UTF8') - 或执行一次
SET client_encoding = 'UTF8';(不推荐,每次连接都要手动) - 检查数据库服务端编码:
SHOW SERVER_ENCODING;应为UTF8;SHOW CLIENT_ENCODING;在连接后查,应与你设的一致 - Windows 下若仍乱码,终端先运行
chcp 65001,再启动 Python,否则psycopg2可能被底层libpq拉回GBK
SQLite 不涉及服务端编码,但要注意 Python 层面的 bytes vs str
SQLite 本身存储是 byte-oriented,没有强制字符集。乱码通常是因为你用 open() 读取了含中文的 SQL 文件(该文件是 GBK 编码),却没指定 encoding='gbk',导致 SQL 字符串本身已损坏,再执行就全乱。
- 执行 SQL 前,确认字符串是
str类型,不是bytes;打印type(sql_str)和repr(sql_str)辅助判断 - 读取外部 SQL 文件时,显式加
encoding='utf-8'(或'gbk',视文件实际而定) - SQLite 的
text_factory默认是str,一般不用动;但若遇到sqlite3.ProgrammingError: You must not use 8-bit bytestrings,说明你传了bytes给 SQL 参数,要改成str
真正麻烦的从来不是“怎么配”,而是“谁在哪个环节悄悄改了编码”——数据库驱动、Python 解释器启动环境、终端代码页、甚至 Windows 注册表里的 OEMCP 都可能插一脚。最稳的做法:所有环节统一用 UTF-8,数据库设 utf8mb4,连接加 charset,终端切 chcp 65001(Windows)或 export LANG=en_US.UTF-8(Linux/macOS),然后只在一个地方出问题,才好定位。


















