[已修复] SQLite 版本问题

💡Lv.10 顾问 🌏 正式会员
2026-09-15 12:58:47
SQLite 版本 ≥ 3.33
老大,我的宝塔面板,只有3.26,不能升级,能不能不强制要求啊?应该也能使用吧?
Last edited by flinthub at 2026-09-16 18:52
知识,奉行,知行合一
| Views 169 | Replies 7

All Replies (5)

👑Lv.11 元老 🌏 正式会员
2026-09-15 15:26:04
我研究一下啊。
轻量级、高性能、零 MySQL 依赖的PHP社区系统。
#1 floor
👑Lv.11 元老 🌏 正式会员
2026-09-15 15:54:46

SQLite 3.26 兼容性核查报告

(在这个回帖底部有附件,你用附件新的install替换一下)

  • 核查日期:2026-09-15
  • 核查对象:FlintHub(SplitDB 纯 SQLite 分片引擎)
  • 核查范围:前台、后台(管理端)、CLI 维护脚本、plugins、update 升级包
  • 目标:评估工程能否在 SQLite 3.26(2018-12-01)上运行,基线为 3.33(2020-08-14)

一、结论摘要

可以兼容,改动很小。 全工程实际使用的 SQL 特性下限为 SQLite 3.24(UPSERT),3.26 完全满足。

真正被 3.26 挡住的只有两处:

# 位置 问题 影响
1 install.php 环境检测硬门槛 SQLite ≥ 3.33 版本判断写死 3.33 3.26 直接安装失败
2 cli/archive.php 的 VACUUM INTO(需 ≥ 3.27) 3.26 下每轮抛错 冷数据归档功能每次运行全部跳过(不丢数据,但功能失效)

其余代码注释中提到的版本要求均为误导性注释,实际不构成依赖(见第五节)。


二、3.26 → 3.33 版本差异逐项核对(官方 changelog)

2.1 用户列出的 7 项 3.33 特性

# 特性 引入版本 代码是否使用 证据
1 最大数据库文件提升至 281 TB 3.33 ❌ 引擎容量上限,非 SQL 特性;小型分片库,无任何 page_size/容量逻辑
2 WAL 崩溃恢复增强(shm 自动恢复) 3.33 ❌ 引擎行为改进,代码不感知;仅做标准 PRAGMA 设置
3 UPDATE FROM 3.33 ❌ 全库无此语法;所有 UPDATE 均为 WHERE ... IN (SELECT ...) / 相关子查询传统写法
4 SQLITE_DETERMINISTIC 求值策略调整(3.32) 3.32 ❌ 只影响自定义 SQL 函数;工程未注册任何自定义函数(无 PDO::sqliteCreateFunction,无扩展加载)
5 CLI 输出模式(box/json/markdown/table) 3.33 ❌ 仅影响 sqlite3 命令行工具 dot-command;工程为 PHP 应用,不依赖 sqlite3 CLI
6 decimal.c 扩展 3.33 ❌ 未加载任何扩展
7 PRAGMA integrity_check 单表检查 3.33 ❌ 全库无 integrity_check 调用;后台"数据库一致性检查"为应用层自研 SQL 对账

2.2 3.24 ~ 3.33 之间新增的关键语法特性(对照)

特性 引入版本 代码是否使用
UPSERT INSERT ... ON CONFLICT DO UPDATE 3.24.0 ✅ 大量使用(兼容 3.26)
窗口函数 OVER 3.25.0 ❌ 未使用
ALTER TABLE ... RENAME COLUMN 3.25.0 ❌ 未使用
VACUUM INTO 3.27.0 ⚠️ 仅 cli/archive.php 使用(3.26 不兼容)
NULLS FIRST/LAST、聚合 FILTER 3.30.0 ❌ 未使用
生成列 GENERATED、ADD COLUMN 非恒定默认值 3.31.0 ❌ 未使用(补列全为恒定默认值)
UPDATE FROM 3.33.0 ❌ 未使用

结论:工程实际使用的 SQL 特性下限是 3.24(UPSERT);唯一超过 3.26 的依赖是 VACUUM INTO(3.27)。


三、工程实际使用的 SQLite 特性清单(均 ≤ 3.26)

特性 最低版本 使用位置
UPSERT ON CONFLICT ... DO UPDATE(单冲突目标,无 WHERE) 3.24.0 app/Helpers/Settings.php、app/Helpers/Vote.php、SessionHandler、Permission、plugins/third_party_login 等
INSERT OR IGNORE / INSERT OR REPLACE 3.0 全工程
WAL(PRAGMA journal_mode = WAL) 3.7.0 app/SplitDB/DBFactory.php
PRAGMA wal_checkpoint(TRUNCATE) 3.8.x app/Controllers/Admin/DatabaseController.php:669/782
PRAGMA query_only = true 3.8.0 DatabaseController.php:474/540/627
普通 VACUUM 3.0 DatabaseController.php:783、cli/shrink_business.php
strftime 日期函数 远古 app/Helpers/Blog.php 等
DESC 复合索引 3.3.0 app/SplitDB/Schema.php
子查询驱动 UPDATE/DELETE 远古 cli/archive_mark.php:70-72、plugins/qa/Plugin.php:179 等

四、后台(管理端)专项核查

对 app/Controllers/Admin/* 与 plugins/*/AdminController.php 做了专项扫描,结果:

  • 未命中:UPDATE FROM、NULLS FIRST/LAST、FILTER、窗口函数 OVER、RETURNING、GENERATED、STRICT、integrity_check、CREATE TRIGGER/VIRTUAL TABLE。
  • 仅使用的 PRAGMA:query_only、wal_checkpoint(TRUNCATE)、普通 VACUUM —— 均为 3.8 时代特性,3.26 可用。
  • DatabaseController.php:5 文档注释提到"备份 → 逐库 VACUUM INTO",但实际备份实现(handleBackup,约 659-686 行)已是「WAL checkpoint + 整目录打包 zip」,不依赖 3.27,仅注释过时。
  • 插件管理控制器:全部干净,无任何版本敏感 SQL。

五、误导性注释清单(不构成阻塞,建议后续顺手清理)

位置 原文 实际情况
install.php:78 "兼容基线 3.33:ON CONFLICT/WAL/无 RETURNING 兼容均依赖版本" UPSERT 3.24+ 即可;WAL 3.7+;RETURNING 是被刻意规避(3.35+)
app/Controllers/Admin/DatabaseController.php:5 "备份 → 逐库 VACUUM INTO 生成一致性快照" 实际为 checkpoint + zip,无 VACUUM INTO 依赖
app/SplitDB/IDGenerator.php 头部注释 规避 RETURNING 以兼容 3.33 RETURNING 需 3.35,规避正确,但与 3.33 基线无关

六、文件格式兼容

  • 全部表为普通 rowid 表(INTEGER PRIMARY KEY),无 WITHOUT ROWID、无生成列、无 STRICT、无表达式索引 → 文件格式未升级,3.33 建的库文件 3.26 可直接打开读写。
  • WAL 文件(-wal/-shm)自 3.11 起同为 version 2,双向兼容。

七、兼容方案与实施状态

已实施:install2.php(本仓库根目录)

将 install.php 复制并修改版本门槛后命名 install2.php,供 3.26 环境使用:

  • 门槛由 >= 3.33.0 放宽至 >= 3.24.0(工程真实 SQL 下限);
  • 检测文案同步更新为「SQLite 版本 ≥ 3.24(推荐 ≥ 3.33)」;
  • 注释修正为真实依赖说明。

注意:install.php 本身(3.33 基线)保持不变,install2.php 为独立副本,两者可并存。

待确认:cli/archive.php 版本回退(方案 B,未实施)

cli/archive.php:122 的 VACUUM INTO 需 3.27+。若需 3.26 环境下归档功能可用,建议加运行时版本判断:

  • sqlite_version() >= 3.27:保持 VACUUM INTO 原逻辑(快照 + 压缩);
  • < 3.27:回退为「PRAGMA wal_checkpoint(TRUNCATE) + 直接复制 .sqlite 文件」——归档为 CLI 低并发场景,checkpoint 后复制即一致性快照。

该改动涉及 cli/archive.php(根目录 + flinthub1.0.0 两处拷贝),是否实施待用户确认。

未实施(不推荐做)

  • 降低 update/1/install.php、flinthub1.0.0/install.php 的同款门槛 —— 属历史发布包,仅当前根目录 install2.php 已满足交付需求,如需同步另行确认。

八、核验证据索引

证据 位置
版本硬门槛(3.33) install.php:78-91(install2.php 已放宽为 3.24)
VACUUM INTO(3.27+) cli/archive.php:122
备份实际实现(checkpoint+zip,无 VACUUM INTO) app/Controllers/Admin/DatabaseController.php:659-686
标准 PRAGMA 初始化 app/SplitDB/DBFactory.php:27-36
UPSERT 用法 app/Helpers/Settings.php 等
归档标记(子查询 UPDATE) cli/archive_mark.php:70-72
轻量级、高性能、零 MySQL 依赖的PHP社区系统。
#2 floor
👑Lv.11 元老 🌏 正式会员
2026-09-15 15:55:59
ahfanxin 发表于: SQLite 版本 ≥ 3.33老大,我的宝塔面板,只有3.26,不能升级,能不能不强制要求啊?应该也能使用吧?

你用我提供的install.php替换一下,如果php版本是8.5,你再看看其他的升级包,按顺序换一下,不换也不影响使用。

轻量级、高性能、零 MySQL 依赖的PHP社区系统。
#3 floor
💡Lv.10 顾问 🌏 正式会员
2026-09-15 17:37:50
安装完成了,但是为什么不能登录呢?登录页是404
知识,奉行,知行合一
#4 floor
👑Lv.11 元老 🌏 正式会员
2026-09-15 17:49:46

ahfanxin 发表于:安装完成了,但是为什么不能登录呢?登录页是404

你用的是nginx吗?你参考一下我这个附件。
或者你让ai根据我提供的附件配置,帮你配置一下。

轻量级、高性能、零 MySQL 依赖的PHP社区系统。
#5 floor

Please Log in