感谢您的详细反馈!您报告的 4 个问题在 v0.1.2 里全部修复了。坦白说,这些都是真实的 bug,不是「用户使用方式的问题」------您的 Linux Mint 测试指出了 SlothDB 在中文环境下几个严重的缺失,非常感谢。
4 个问题的修复状态
1. 交互 shell 中汉字按一次删除键只能删半个字 → 已修复
原因:v0.1.0 的 shell 用 std::getline 读输入,终端处于 canonical 模式,按字节而不是按 UTF-8 字符回删。v0.1.2 集成了
antirez 的 linenoise 库(MIT 协议),按真正的 UTF-8 字符边界删除,一次按键删一个汉字。
2. 无法读取中文列名 → 已修复
原因:SQL tokenizer 用 std::isalpha / isalnum 判断标识符,这两个函数对高位字节(汉字 UTF-8 编码都是 ≥ 0x80)返回
0,所以汉字列名直接报 Unexpected character。v0.1.2 修改了 tokenizer,把所有高位字节都视为标识符字符。
现在可以直接写:
CREATE TABLE 销售 (区域 VARCHAR, 销售额 BIGINT);
INSERT INTO 销售 VALUES ('华东', 100), ('华南', 200), ('华东', 50);
SELECT 区域, SUM(销售额) FROM 销售 GROUP BY 区域 ORDER BY 区域;
-- 华东 | 150
-- 华南 | 200
也能直接查中文表头的 CSV:SELECT 区域 FROM '数据.csv'。日语、韩语、任何 UTF-8
字符都支持,规则是「所有高位字节都算标识符字符」,不做语言特判。
3. 方向键显示 ^[[D 而不是移动光标 → 已修复
原因:canonical 模式下方向键产生的 ESC 序列被 getline 当成普通字符读入。linenoise 切换到 raw 模式并自己解析 ESC
序列。现在:
← / → 移动光标
↑ / ↓ 浏览历史记录
Ctrl+A / Ctrl+E 跳到行首/行尾
Tab 补全 SQL 关键字和 dot 命令
- 历史记录自动保存在当前目录
.slothdb_history 文件里
4. .help 信息太简单 → 已修复
v0.1.2 的 .help 现在会列出:
- 所有 dot 命令:
.help / .quit / .tables / .schema / .open / .version / .clear
- 7 种文件格式的查询示例(CSV / Parquet / JSON / Excel / Avro / Arrow / SQLite)
- 持久化表的用法
- 多行输入规则(分号结尾才执行)
- 快捷键说明
新增的 dot 命令:
.tables [PATTERN] ------ 列出所有表(可选 LIKE 模式)
.schema [TABLE] ------ 查看表结构
.open <path> ------ 关闭当前 DB 切换到另一个
slothdb --version / slothdb --help ------ 命令行参数
如何升级到 v0.1.2
下载地址: Release v0.1.2 · SouravRoy-ETL/slothdb · GitHub
Linux (.deb):
wget https://github.com/SouravRoy-ETL/slothdb/releases/download/v0.1.2/slothdb_0.1.2_amd64.deb
sudo dpkg -i slothdb_0.1.2_amd64.deb
Linux (二进制直接运行):
wget https://github.com/SouravRoy-ETL/slothdb/releases/download/v0.1.2/slothdb
chmod +x slothdb
./slothdb
Python:
pip install --upgrade slothdb
之前的 slothdb_0.1.2_amd64.deb 确实被我重新打包过好几次(修了 macOS 构建错误 + 补了这些中文相关的
bug),导致下载链接一度 404,不好意思。现在 release 稳定了,不会再动。
如何验证修复
安装后进入交互 shell,跑一遍您之前踩过的几个场景:
$ slothdb
SlothDB Shell v0.1.2
Type .help for help, .quit to exit.
Connected to in-memory database
slothdb> .help # 应该看到完整帮助
slothdb> CREATE TABLE 测试 (名称 VARCHAR, 数量 BIGINT);
slothdb> INSERT INTO 测试 VALUES ('甲', 10), ('乙', 20);
slothdb> SELECT 名称, 数量 FROM 测试; # 中文列名能查
slothdb> SELECT * FROM 测试_ # 按一次退格,整个汉字被删
slothdb> SELECT * FROM 测试; # ↑ 可以找到刚才那条历史
slothdb> .quit
还有一个遗留问题(坦白告知)
shell 输出含汉字的表格时,列宽用的是字节数不是显示宽度,汉字在终端占 2 个字符宽但代码按 1
算,所以对齐会有点歪。数据完全正确,只是视觉对齐。后续会用 wcswidth 修掉,这个算是 v0.1.3 的 TODO。
再次感谢您的详细 bug 报告 ------ 您发现的每一个问题都是真实的、应该修的 bug,不是「用了错误的姿势」。如果 v0.1.2
上还遇到其他问题,欢迎在 GitHub
Issues(https://github.com/SouravRoy-ETL/slothdb/issues)继续反馈,或者直接在这里回我。