最近收到一个需求,要对比一下 SeekDB 和 OceanBase 的 SQL 语法差异,我花了点时间对比了一下,正好分享出来,大家应该会感兴趣。先 BB 几句背景:
SeekDB 是从 OceanBase 4.3.5 版本(提交 4b8c513fcc21)分叉出来的数据库项目,在保持 OceanBase 核心 SQL 语法兼容性的基础上,针对 AI 搜索和位置管理等场景进行了功能增强和精简。这里要再说一下,SeekDB 只支持 MySQL 模式,不支持 Oracle 模式。基于 SQL 解析器文件的详细对比,总结了 SeekDB 与 OceanBase 在 SQL 语法层面的主要差异。当然这里只是针对 4b8c513fcc21 版本的对比,后面的 OceanBase 版本 4.4/4.5 我印象里也是有 AI 功能的。
对比方法
通过对比两个项目的 SQL 解析器文件(sql_parser_mysql_mode.y):
-
基准版本: OceanBase 4.3.5(27086 行,1134 个语法规则)
-
对比版本: SeekDB 当前版本(26507 行,1096 个语法规则)
-
对比方式: 基于 Git 历史分析和语法规则提取
主要差异概览
1. 删除的功能(8 项)
SeekDB 移除了以下 OceanBase 中的功能,这些功能在 SeekDB 中不再支持:
| 功能 | SQL 语句 | 说明 |
|------|---------|------|
| 审计功能 | AUDIT | 数据库审计相关语句 |
| 表空间管理 | CREATE TABLESPACEDROP TABLESPACEALTER TABLESPACE | 表空间的创建、删除和修改 |
| 主密钥轮换 | ROTATE MASTER KEY | 主密钥轮换功能 |
| 敏感规则管理 | CREATE SENSITIVE RULEDROP SENSITIVE RULEALTER SENSITIVE RULE | 敏感数据规则管理 |
其实就可以理解为租户相关的、集群管理相关的、还有bootstrap什么的都删除了。
2. 新增的功能(4 项核心语句 + AI 搜索)
SeekDB 新增了以下功能:
2.1 位置管理(Location Management)
SeekDB 引入了完整的位置管理功能,用于管理外部存储位置:
-- 创建位置
CREATE LOCATION loc1 URL 's3://bucket/path'
CREDENTIAL (ACCESSID='id', ACCESSKEY='key');
-- 修改位置
ALTER LOCATION loc1 URL 's3://bucket/newpath';
-- 删除位置
DROP LOCATION loc1;
-- 查看所有位置
SHOW LOCATIONS;
-- 查看位置创建语句
SHOW CREATE LOCATION loc1;
-- 查看位置中的文件
SHOW FILES IN LOCATION @loc_var '/subpath';
特点:
-
支持 S3 等外部存储的位置管理
-
支持认证信息(CREDENTIAL)配置
-
支持使用用户变量(
@loc_var)和子路径 -
新增相关权限:
CREATE LOCATION、READ、WRITE
2.2 AI 搜索功能
SeekDB 在 2025 年 10 月集中引入了 AI 搜索相关功能:
MATCH() 函数(2025-10-13 引入)
AI 搜索功能是 SeekDB 的核心功能之一,主要用于支持全文搜索、向量搜索和混合搜索。感兴趣的话也可以翻翻文档,我这里就列一下基本用法。
-- 基本用法
SELECT MATCH(content) AGAINST('database' IN NATURAL LANGUAGE MODE) as score
FROM doc_table
WHERE MATCH(content) AGAINST('database' IN NATURAL LANGUAGE MODE);
-- 多列匹配
SELECT MATCH(query, content) AGAINST('text' IN NATURAL LANGUAGE MODE) as score
FROM doc_table;
-- 带权重的列
SELECT MATCH(query^2, content) AGAINST('text' IN NATURAL LANGUAGE MODE) as score
FROM doc_table;
SCORE() 函数(2025-10-13 引入)
SELECT id, SCORE() as score
FROM doc_table
WHERE MATCH(content) AGAINST('database' IN NATURAL LANGUAGE MODE);
HYBRID_SEARCH() 函数(2025-10-16 引入)
SELECT id, HYBRID_SEARCH('search text', 'param') as hybrid_result
FROM doc_table;
VECTOR_SIMILARITY() 函数(2025-10-17 引入)
-- 使用 COSINE 度量
SELECT VECTOR_SIMILARITY(vector1, vector2, COSINE) as similarity
FROM vector_table;
-- 支持多种度量方式:COSINE、DOT、EUCLIDEAN、MANHATTAN
SELECT VECTOR_SIMILARITY(vector1, vector2, DOT) as similarity
FROM vector_table;
3. 语法增强
LOCATION 表达式扩展
在 CREATE TABLE 和 ALTER TABLE 中,LOCATION 子句的功能得到增强:
OceanBase 4.3.5:
CREATE EXTERNAL TABLE t1 (id INT) LOCATION 's3://bucket/path';
SeekDB:
-- 支持用户变量
CREATE EXTERNAL TABLE t1 (id INT) LOCATION @loc_var;
-- 支持子路径
CREATE EXTERNAL TABLE t1 (id INT) LOCATION @loc_var '/subpath';
-- 仍然支持字符串字面量
CREATE EXTERNAL TABLE t1 (id INT) LOCATION 's3://bucket/path';
兼容性分析
完全兼容的语句
以下核心 SQL 语句在两个版本中完全一致,无需修改:
-
CREATE INDEX- 索引创建语法完全相同 -
ALTER TABLE- 表修改语法完全相同(LOCATION 子句除外) -
CREATE TABLE- 表创建语法完全相同(LOCATION 子句除外) -
其他 DDL、DML 核心语句
需要关注的差异
-
LOCATION 子句: SeekDB 支持用户变量和子路径,这是语法增强,向后兼容
-
已删除功能: 如果使用了表空间、审计等功能,需要调整
-
新增功能: AI 搜索和位置管理是 SeekDB 独有的功能
测试验证
为了验证这些 SQL 语法的正确性,我编写了语法测试用例:
以下就是为了演示说明,完整的测试方式我看看能不能把代码贴出来。
# 测试位置管理语法
def test_create_location_syntax():
valid_sqls = [
"CREATE LOCATION loc1 URL 's3://bucket/path'",
"CREATE LOCATION loc1 URL 's3://bucket/path' CREDENTIAL (ACCESSID='id', ACCESSKEY='key')",
"CREATE OR REPLACE LOCATION loc1 URL 's3://bucket/path'",
]
# 验证语法结构...
# 测试 AI 搜索语法
def test_match_function_syntax():
valid_sqls = [
"SELECT MATCH(content) AGAINST('text' IN NATURAL LANGUAGE MODE) FROM doc_table",
"SELECT MATCH(query, content) AGAINST('text' IN NATURAL LANGUAGE MODE) FROM doc_table",
]
# 验证语法结构...
我写的测试都跑过了,其实就是确认下新增功能的 SQL 语法格式正确。我大概就说这么多吧,SQL 语法有问题欢迎找我。我是神圣安伯大魔王,负责 OceanBase 开发者相关的技术文档。求轻喷就行了。