Navicat连接加密SQLite必须选对加密类型:SQLCipher(内置支持,右键“编辑连接”设密码即启用)或wxSQLite3(需手动替换动态库并配置路径),二者不兼容,填错会导致连接失败或读不出数据。
Navicat 连接加密 SQLite 必须选对加密类型
navicat 自身支持两种主流 sqlite 加密方式:sqlcipher(默认用于“设置密码”流程)和 wxsqlite3(需手动替换动态库)。两者不兼容,填错类型会导致连接成功但读不出数据,或直接报 file is encrypted or is not a database 错误。
判断当前数据库用的是哪种加密:
- 如果是在 Navicat 里右键数据库 → “编辑连接” → “高级” → 勾选“加密”并设置了密码 → 那就是
SQLCipher(Navicat 内置支持,无需额外配置) - 如果是通过外部工具(如
sqlcipher命令行)加密,或替换了sqlite3.dll/libsqlite3.dylib为 wxSQLite3 版本 → 则必须在 Navicat 的“偏好设置 → 环境 → SQLite3 动态库路径”中指向该自定义库,否则会静默失败
连接 SQLCipher 加密的 SQLite 时 key 参数不能省略
Navicat 对 SQLCipher 数据库的连接逻辑是:先用空密码尝试打开,失败后再用你填的密码重试。但这个机制只在“编辑连接”时有效;一旦数据库已加密,新建连接就必须显式提供密码——且必须填在“高级”选项卡的“加密”区域,而非“常规”里的用户名/密码栏。
常见错误现象:
- 在“常规”选项卡的
Username或Password栏填了密码 → 连接失败或显示空表(SQLite 本身无用户系统,这些字段会被忽略或干扰驱动) - “高级”里勾了加密但没输密码,或两次输入不一致 → 报
database disk image is malformed或直接黑屏 - 密码含特殊字符(如
@、/、空格)→ Navicat 不做 URL 编码,建议改用字母+数字组合避免解析异常
Java 或其他程序连 Navicat 加密库要换驱动,不是改 URL
Navicat 加密生成的 SQLCipher 数据库,不能用标准 org.sqlite.JDBC 驱动打开。即使加了 ?password=xxx 参数,也会抛 java.sql.SQLException: file is encrypted or is not a database。
必须使用专用驱动:
- Maven 依赖用
sqlite-jdbc-crypt(注意 groupId 是io.github.willena,不是官方 sqlite-jdbc) - URL 中必须指定
dbmode=navicat_sqlcipher,例如:jdbc:sqlite:/path/to/db.db?dbmode=navicat_sqlcipher&key=hexstring - 这里的
key不是明文密码,而是 Navicat 加密时生成的十六进制密钥(可在加密成功后从 Navicat 日志或临时文件中提取;若丢失,只能重新加密)
WAL 模式 + 加密 = Navicat 表不可见的高发组合
启用 WAL 后再加密,或加密后由其他程序(如 Python 的 sqlite3 模块)以 WAL 模式打开过,极易导致 Navicat 连接后 sqlite_master 查不到表、新建表不落盘。
根本原因:Navicat 的 SQLCipher 集成对 WAL 文件(.db-wal 和 .db-shm)支持不完整,尤其在未正常关闭连接时残留 WAL 文件会破坏一致性。
解决步骤(缺一不可):
- 确保所有外部进程(Python、Node.js、命令行
sqlite3)已退出 - 用命令行强制切换回 rollback journal:
sqlite3 /full/path/to/encrypted.db "PRAGMA journal_mode=delete;"(注意:此操作需先用正确密码解锁,可用sqlcipher命令行工具) - 手动删除同目录下的
.db-wal和.db-shm文件 - 重启 Navicat,再测试连接
这个组合问题最常被忽略:你以为是密码错了,其实是 WAL 文件卡住了元数据加载。


















