根本原因是Navicat默认UTF-8解码与SQLite文件实际编码(如GBK)不匹配;需在连接高级设置中手动指定Character set为UTF-8,且确保数据库内容本身为UTF-8编码。
Navicat 读 SQLite 数据库显示中文为问号或方块
根本原因不是 sqlite 自身不支持中文,而是 navicat 默认用 utf-8 解码时,误判了数据库文件的实际编码(比如建库时用的是系统默认编码如 gbk),或者 sqlite 的 pragma encoding 设置与实际不符。
- SQLite 数据库文件本身没有强制的“字符集声明”,它的编码取决于创建时连接的编码和写入方式
- Navicat 连接 SQLite 时不会自动探测编码,它依赖你手动指定或沿用上次设置
- 如果数据库是用 Python 的
sqlite3、DB Browser for SQLite 或旧版工具创建的,很可能没显式设UTF-8,导致 Navicat 按错误编码解析字节流
在 Navicat 中手动指定连接编码为 UTF-8
这不是改数据库,而是告诉 Navicat:“请用 UTF-8 去解读这个文件里的字节”。只要数据本身确实是 UTF-8 编码存进去的(绝大多数现代工具默认如此),这步就能立刻见效。
- 右键已保存的 SQLite 连接 → 编辑连接
- 切换到 高级 页签
- 找到
Character set下拉框,选UTF-8(不是Auto,也不是GBK) - 点确定,重新连接 → 中文应该正常显示了
注意:Character set 这个设置只影响 Navicat 如何解码从 SQLite 返回的文本字段,不影响数据库文件结构或存储格式。
确认 SQLite 数据库实际是否为 UTF-8 编码
如果设了 UTF-8 还是乱码,说明数据可能真不是 UTF-8 存的。这时候不能硬调 Navicat,得查源头。
- 用命令行打开数据库:
sqlite3 your.db - 执行:
PRAGMA encoding;—— 它返回的是 SQLite 内部记录的编码标识,比如"UTF-8"、"UTF-16le",但这个值只是建议性标记,不强制校验 - 更可靠的方法:用十六进制查看器打开
.db文件,找一条含中文的记录对应位置,看字节是否符合 UTF-8 编码规则(例如中文通常为 3 字节,以E4–E9开头) - 如果确认是 GBK 编码存的(比如字节像
C4 E3),那必须用 GBK 工具重导一次,Navicat 设GBK才能显示,但后续写入会出问题 —— 强烈建议统一转成 UTF-8
Python 或其他程序写入时没设编码,导致 Navicat 读不出来
常见于用 sqlite3 模块直接 execute("INSERT INTO t VALUES ('中文')") 却没处理连接编码。Python 3 默认字符串是 Unicode,但底层写入 SQLite 时仍依赖连接的编码配置。
- Python 中应显式设置连接编码:
conn = sqlite3.connect("test.db"); conn.execute("PRAGMA encoding = 'UTF-8'") - 更稳妥的做法:在建库后立即执行
PRAGMA encoding = "UTF-8",并确保所有文本都以 Python str(非 bytes)传入 - 避免用
open().read()读 SQL 文件再执行,除非明确用encoding="utf-8"打开,否则文件本身的编码可能污染内容
Navicat 的编码设置只是最后一道解析关卡,前面任意一环用了非 UTF-8,它就无能为力。










