Files
胡飞 786c6454cb fix(db): MySQL 结果列字符集未知时按 UTF-8 兜底解码
现象:连接某些 MySQL 兼容实现/代理时,结果列元数据的 character_set 字段为 0
(日志里 collation_id=0、charset=unknown、cause=charset-decode),而
decode_character 在拿不到 decoder 时一律降级为 DbValue::Binary,文本列因此在网格里
显示成「二进制 · N B」;元数据查询与自定义 SQL 不走 schema 纠偏,同样受影响。
样本显示这些字节是合法 UTF-8 且不含控制字符,即内容本身是文本。

修复:字符集未知(collation 0 / 未映射)时用严格 UTF-8 兜底解码,与
decode_untyped_bytes 对无类型字节的判定保持一致(合法 UTF-8 且无控制字符)。
非法 UTF-8 或含控制字符的字节仍保留二进制 sidecar;wire 已声明 collation 63 的
字节列仍走 wire-binary 分支;已声明字符集的列行为不变。

代价:字符集未知的服务端上,内容是「可打印 ASCII」的真二进制列会显示为文本;
这类字节此前显示为二进制,属显示层面的取舍,若需严格区分可按 BINARY_FLAG 收窄。

验证:cargo test -p db --lib 1314 passed;新增 3 个 codec 回归测试(collation 0 与
未映射 collation 的文本解为 Text,控制字符与非法 UTF-8 仍为 Binary);
clippy -p db --all-targets 对本文件无告警。
2026-09-21 16:18:29 +08:00
..

Database Abstraction Layer

这个 crate 提供了一个统一的数据库抽象层,支持多种数据库类型。

架构

  • src/ - 顶层接口和公共类型

    • plugin.rs - DatabasePlugin trait 与数据库能力入口
    • plugin_manifest.rs - 数据库 UI manifest 合同,承载表单、能力位、动作元数据
    • manager.rs - 数据库管理器
    • connection.rs - 连接接口和连接池
    • executor.rs - SQL 执行器
    • runtime.rs - Tokio 运行时
    • types.rs - 公共类型定义
  • src/mysql/ - MySQL 实现

  • src/postgresql/ - PostgreSQL 实现

  • src/sqlite/ - SQLite 实现

crates/db 现在同时负责两层职责:

  • 数据库运行时能力:连接、元数据、SQL 构建、导入导出
  • 数据库 UI 合同:ui_manifest() 返回纯数据 manifest,供 db_view 做统一渲染

新增数据库插件时,除了实现 DatabasePlugin 的运行时方法,也应在插件侧返回 对应的 DatabaseUiManifest,并通过 resolve_reference_data() 提供动态下拉数据 (如 charset / collation / engines)。

使用示例

use db::{DbManager, DatabaseType, DbConnectionConfig};

let manager = DbManager::new();
let plugin = manager.get_plugin(&DatabaseType::MySQL)?;
let connection = plugin.create_connection(config).await?;