@
h3xz 不知道你是怎么存的。我写个示例,你按情况改了后,执行看看?
1. 准备 SQLite 环境
原因:
① 不想在这儿写 C/C++,太冗长。
② 后文的脚本,需要用到 dll 没有的,仅命令行版本才有的 readfile 函数。
步骤:
① 打开
https://sqlite.org/download.html② 找到 sqlite-tools-win-x64-3450200.zip (当前版本)并下载(若 Linux/MacOS 找对应平台的)
③ 解压,得到 sqlite3.exe
2. 准备(存数据的) SQL 文件
参考以下内容,按你自己情况更改后,用 UTF-8 编码,保存为 test.sql 。
```sql
-- 把默认页大小 4KB 改为 64KB 。因为你大部分数据都很大,一次读取便加载更多数据,能提速
PRAGMA page_size = 65536;
CREATE TABLE image (
id INTEGER PRIMARY KEY,
-- 假设你通过名字来定位图片及其他数据。UNIQUE 既创建了索引,也保证名字唯一
name TEXT NOT NULL UNIQUE,
-- 注意,默认生成的时间,是 UTC 时间,比中国慢 8 个小时
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
extra_data JSON,
data BLOB NOT NULL
);
BEGIN;
-- 省略 id ,SQLite 则会自动填写为最大 ID + 1 。
-- 单引号内的 \ 不用转义。若要表示 ',双写即可。如 'Kai''Sa.jpg'。
-- 文件路径不要包含中文,因为 SQLite 会把 UTF8 字符串,原样调用系统 API ,然而 Windows 会以为是 GBK 编码。。
-- 如果文件路径一定包含中文,请保证其它字符串(如 name 列)没有中文,然后 SQL 文件转为 GBK 编码。
INSERT INTO image (name, data) VALUES ('aaa.jpg', readfile('C:\aaa.jpg'));
INSERT INTO image (name, data) VALUES ('bbb.jpg', readfile('C:\bbb.jpg'));
INSERT INTO image (name, extra_data, data) VALUES ('ccc.jpg', '{"width": 123, "height": 456}', readfile('C:\ccc.jpg'));
COMMIT;
-- 可选:碎片整理数据库文件,并去除冗余空间,达到瘦身紧实的效果。
-- VACUUM;
SELECT printf('写入了 %d 个文件,共 %d 字节。', COUNT(*), SUM(LENGTH(data))) FROM image;
```
3. 执行
```shell
sqlite3.exe images.db < test.sql
```