ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Turso 的 SQLite 兼容性全解析:版本基线、支持矩阵与迁移路径

Turso 的 SQLite 兼容性全解析:版本基线、支持矩阵与迁移路径 Turso 的 SQLite 兼容性全解析版本基线、支持矩阵与迁移路径【免费下载链接】tursoA SQL database in Rust: SQLite-compatible, now also speaking Postgres (experimental). The LLVM of databases.项目地址: https://gitcode.com/GitHub_Trending/tu/tursoTurso仓库内又称 Limbo是一个用 Rust 重新实现的 SQLite 兼容数据库本文基于仓库根目录 COMPAT.md 展开系统梳理它与 SQLite 之间的兼容性现状包括版本基线、四项兼容性承诺、SQL 查询语言与 C API 的支持矩阵、VDBE 操作码与日志模式等底层差异以及 Turso 特有的扩展功能。读完本文你将能够评估现有 SQLite 应用迁移到 Turso 的可行性明确哪些特性可以放心使用、哪些处于实验状态、哪些尚不支持并了解任何时候都能回到 SQLite的迁移路径是如何被保障的。兼容性承诺与验证方式Turso 明确跟踪SQLite 版本 3.50.4sqlite_version()与sqlite3_libversion()均返回该版本同时它也是差分测试differential testing所对齐的版本基线。在源码中版本常量 同时定义了字符串形式3.50.4与整数形式3050004供sqlite3_libversion_number()使用并在 VDBE 执行器 中实现了sqlite_version()的取值逻辑translate/expr/translator.rs 会拒绝带参数的sqlite_version调用与 SQLite 行为一致。除版本基线外文档还明确了兼容性的判定原则任何未作为opt-in 扩展显式文档化的行为偏差一律视为 Bug。这意味着兼容性不是尽力而为而是被当作缺陷跟踪的硬性目标。兼容性通过两条路径持续验证针对 SQLite 的差分测试仓库中 sqlite/conformance 目录存放.sqltest测试语料库其 Makefile 定义了run、run-cli、run-rust、run-js等多个后端CLI 子进程、原生 Rust 绑定、JavaScript 绑定并可通过--cross-check-binary指定 SQLite 二进制做交叉比对testing/simulator的模拟器也支持--differential模式对同一交互计划同时在 Turso 与 SQLite 上执行并比对结果。SQLite TCL 测试套件的持续移植仓库的 sqlite/conformance/upstream 保留了大量上游测试语料Makefile中的convert目标可将 Tcl.test文件转换为.sqltest格式逐批纳入回归。四项核心保证COMPAT.md 给出了四项对使用方最重要的承诺随时可以回到 SQLite——迁移不是单向的。SQLite 创建的数据库文件可以在 Turso 中直接打开访问——文件格式完全兼容。任何不兼容的 Turso 特性都必须显式 opt-in并且只要可能就提供一条回到 SQLite 的迁移路径。不支持 SQLite 与 Turso 在多进程场景下混用。这四项承诺构成了整个兼容性文档的价值观骨架兼容是默认值扩展是例外回退路径始终保留。现状总览Features 与 Limitations文档用两个符号概括整体状态✅ SQLite文件格式完全支持 SQLite查询语言部分支持 SQLiteC API 部分支持最重要的已知限制文本必须是合法 UTF-8SQLite 的 TEXT 本质上是裸字节串从不校验编码因此文本列可以容纳任意字节。而 Turso 用 Rust 的String表示文本必须是合法 UTF-8。当字节到文本的转换遇到非法 UTF-8 时Turso 会以 UFFFD 替换字符EF BF BD代替 SQLite 保留的原始字节SELECT HEX(CAST(X96 AS TEXT)); -- SQLite: 96 -- Turso: EFBFBD该差异影响所有把 blob 变成文本的操作CAST、UPPER/REPLACE等字符串函数、以及||字符串拼接读取一个已含非法 UTF-8 文本列的既有数据库也同样受影响。Blob 的存取不受影响——字节只会在转换为文本时才发生改变。这一点对从 SQLite 迁移已有数据的用户尤其重要先评估存量数据中文本列的编码合法性。SQLite 查询语言支持矩阵语句Statements绝大多数常用语句已完整支持包括ALTER TABLE、ANALYZE、ATTACH DATABASE、事务类语句BEGIN/COMMIT/END/ROLLBACK/SAVEPOINT/RELEASE SAVEPOINT、CREATE/DROP INDEX/TABLE/TRIGGER/VIEW、CREATE TABLE ... STRICT、CREATE VIRTUAL TABLE、CHECK、DELETE、INSERT ... ON CONFLICT (UPSERT)、ON CONFLICT子句、REINDEX、REPLACE、RETURNING子句、EXPLAIN、INDEXED BY以及SELECT的各种形态WHERE、LIKE、LIMIT、ORDER BY、GROUP BY、HAVING、各类JOIN、JOIN USING、NATURAL JOIN。处于Partial部分支持状态的重点语句语句状态说明VACUUM PartialVACUUM INTO支持原地VACUUM为实验性WITH子句 PartialWITH RECURSIVE尚不支持WINDOW函数 Partial聚合函数与row_number、rank、dense_rank、first_value、last_value、nth_value在默认窗口框架下可用缺少percent_rank、cume_dist、ntile、lag、lead自定义窗口框架ROWS/RANGE/GROUPS BETWEEN、EXCLUDE不支持GENERATED列 Partial仅虚拟列不支持 ALTER部分亲和性支持需--experimental-generated-columnsWITHOUT ROWID Partial需--experimental-without-rowid实际为只插入CREATE/INSERT/SELECT含复合主键可用但 UPDATE、DELETE、UPSERT、INSERT OR REPLACE、二级 UNIQUE 约束、二级CREATE INDEX、FOREIGN KEY、CDC 与物化视图均被拒绝AUTOINCREMENT 与缺失主键的拒绝行为与 SQLite 一致CREATE VIEW IF NOT EXISTS Partial非幂等——对已存在视图再次创建会报错而非空操作完全不支持的语句CREATE TRIGGER ... INSTEAD OF视图上的触发器——当前会报出误导性的 no such table 错误。同一连接上的并发写语句Same-connection write statementsSQLite 允许同一连接上同时存在多个活动的写语句例如应用可以 step 一条INSERT ... RETURNING后不关闭它再在同连接上启动另一条写语句。Turso 目前对第二条写语句返回SQLITE_BUSY读语句在写语句活动期间仍可运行。文档明确这是有意为之的兼容性缺口SQLite 的内置写操作码不会在变更中途把控制权交还给应用而 Turso 可能为了异步 I/O 在中间挂起。若允许第二个写者启动丢弃或重置第一个未完成的写者时无法保证只清理该写者而不波及第二个写者的状态。返回SQLITE_BUSY能保持连接状态简单先完成或重置活动的写者再启动下一条写语句。类似的SAVEPOINT、RELEASE、ROLLBACK TO在写语句活动期间也会返回SQLITE_BUSY。SQLite 对SAVEPOINT/RELEASE同样拒绝SQL statements in progress对ROLLBACK TOSQLite 是中止进行中的语句而 Turso 不支持这一点因此也一并拒绝避免挂起的写者恢复执行时越过刚被回滚恢复的页面。这些同连接SQLITE_BUSY拒绝属于错误类... - SQL statements in progress会中止被拒绝的语句必须 reset 或重新执行不能仅仅再次 stepbusy handler 永远不会为它们触发等待也无法解除冲突——只有应用自身完成或重置语句才行。这与 SQLite 一致SQLite 将 statements-in-progress 拒绝报告为错误类SQLITE_BUSY而把 busy handler 保留给锁竞争。还有一个事务语义细节如果BEGIN内的写语句在完成前被 reset 或丢弃且 Turso 未为其打开语句 savepoint则事务变为 rollback-only。之后的COMMIT会回滚整个事务并返回错误ROLLBACK会清除该状态。这防止半成品语句在异步 I/O 点把控制权交还给应用后被错误提交。两点需要注意同一事务中后续执行的语句可能观察到被遗弃语句的部分变更只有事务结束时才撤销ROLLBACK TO某个 savepoint不会清除 rollback-only 标记即使它恢复了被遗弃语句接触过的所有页面——只有ROLLBACK能恢复连接。在实验性 MVCC 模式下还有一个已知缺口连接上的所有语句共享一个 MVCC 事务因此当一条写语句完成而兄弟语句仍活动时其提交会被推迟到最后一个兄弟语句完成。SQLite 则是在写者自身完成时提交剩余语句在只读事务上继续。在 Turso 补齐之前已报告成功的写入在兄弟语句仍活动期间并不持久若事务随后异常结束例如最后一个兄弟读者在扫描中途被 reset 或丢弃或同连接后续写语句在改动行后失败该写入会被静默回滚。建议写入后尽快结束或重置兄弟语句以避免该窗口期。PRAGMA 支持矩阵在 core/pragma.rs 中有 PRAGMA 的注册与解析实现。文档中已支持的 PRAGMA 包括✅ 完整支持application_id、busy_timeout、cache_size、database_list、encoding、foreign_key_list、foreign_keys、freelist_count、fullfsync、function_list、ignore_check_constraints、index_info、index_list、index_xinfo、integrity_check、journal_mode、legacy_file_format、max_page_count、page_count、page_size、pragma_list、query_only、quick_check、schema_version写时模拟 defensive 模式恒为 noop、table_info、table_list、table_xinfo、temp_store、user_version、vdbe_trace。 Partialauto_vacuum读可用写需--experimental-autovacuum、cache_spill仅 Enabled/Disabled、locking_mode仅EXCLUSIVE、module_list可用但只注册了completion与generate_series两个模块、synchronousOFF与FULL支持、wal_checkpoint带参数调用暂不支持。❌ No / Not Neededanalysis_limit、automatic_index、cell_size_check、collation_list、compile_options、data_version、defer_foreign_keys、foreign_key_check、hard_heap_limit、incremental_vacuum、journal_size_limit、legacy_alter_table、mmap_size、optimize、parser_trace、read_uncommitted、recursive_triggers、reverse_unordered_selects、secure_delete、shrink_memory、soft_heap_limit、stats、threads、trusted_schema、vdbe_addoptrace、vdbe_debug、vdbe_listing、wal_autocheckpoint、writable_schema等若干在 SQLite 中已弃用的 PRAGMA 标记为 Not Needed如case_sensitive_like、count_changes、data_store_directory、default_cache_size、empty_result_callbacks、full_column_names、short_column_names、temp_store_directory。Turso 专属 PRAGMA以下 PRAGMA 只存在于 Turso无 SQLite 对应项可通过PRAGMA pragma_list查看PRAGMA说明PRAGMA capture_data_changes_conn配置每连接的变更数据捕获CDC返回(mode, table, version)默认offPRAGMA unstable_capture_data_changes_conncapture_data_changes_conn的不稳定别名形态与行为相同名称可能变化PRAGMA cipher静态加密的密码算法选择与hexkey配对无会话密钥时只读PRAGMA hexkey当前会话的静态加密密钥未设置时返回encryption key is not set for this sessionPRAGMA data_sync_retry磁盘同步失败的重试策略布尔值PRAGMA list_types自省 Turso 类型系统返回(type, parent, encode, decode, default, operators)PRAGMA mvcc_checkpoint_thresholdMVCC checkpoint 调优PRAGMA require_where安全特性启用后拒绝不带WHERE的UPDATE/DELETEPRAGMA i_am_a_dummyrequire_where的别名致敬 MySQL其中require_where的实现可在 core/connection.rs 看到dml_require_where标志的 getter/setter初始化于 core/database.rs。表达式Expressions✅ 完整支持字面量、一元运算符、(expr)、CAST、(NOT) LIKE、(NOT) GLOB、(NOT) REGEXP、IS (NOT)、IS (NOT) DISTINCT FROM、(NOT) BETWEEN ... AND ...由优化器改写、(NOT) IN (SELECT...)、(NOT) EXISTS (SELECT...)、CASE WHEN THEN ELSE END、RAISERAISE(msg)与RAISE(ABORT, msg)在触发器外也可用。 Partialschema.table.column不支持 schema二元运算符仅%、!、!不支持... OVER (...)仅支持聚合函数与ROW_NUMBER()COLLATE不支持自定义排序规则且存在已知 Bug——未知的 collation 名称会被静默当作默认处理而 SQLite 会报 no such collation sequence标量子查询支持但不支持元组形式(x,y) (SELECT ...)。❌ Noagg() FILTER (WHERE ...)、(NOT) MATCH。SQL 函数标量函数abs、char、coalesce、concat、concat_ws、format、glob、hex、ifnull、iif及别名if、instr、last_insert_rowid、length、like含三参数形式、likelihood/likely/unlikely、lower/upper、ltrim/rtrim/trim含第二个参数、max/min多参数、nullif、octet_length、printf、quote、random、randomblob、replace、round单双参、sign、soundex、sqlite_source_id、sqlite_version、substr/substring两参三参、typeof、unhex单双参、unicode、unistr、unistr_quote、zeroblob均已支持。部分支持/不支持changes()与total_changes()仍需支持 update 语句与触发器场景。load_extension(X)仅支持 Turso 原生扩展不支持 SQLite 的.so/.dll。❌sqlite_compileoption_get、sqlite_compileoption_used、sqlite_offset、load_extension(X,Y)。数学函数acos/acosh/asin/asinh/atan/atan2/atanh、ceil/ceiling、cos/cosh、degrees、exp、floor、ln、log(B,X)/log(X)、log10、log2、mod、pi、pow/power、radians、sin/sinh、sqrt、tan/tanh、trunc全部支持实现在 core/functions/math.rs。聚合函数avg、count、count(*)、group_concat单双参、string_agg、max、min、sum、total全部支持median、percentile、percentile_cont、percentile_disc需要 percentile 扩展stddev是 Turso 扩展。日期与时间函数date()、time()、datetime()、julianday()、unixepoch()、strftime()、timediff()全部支持实现在 core/functions/datetime.rs。修饰符Modifiers方面Days/Hours/Minutes/Seconds/Months/Years、TimeOffset/DateOffset/DateTimeOffset、Ceiling/Floor、StartOfMonth/StartOfYear/StartOfDay、Weekday(N)、Auto、UnixEpoch、JulianDay、Localtime/Utc、Subsec 全部 ✅ 支持。JSON 函数JSON 生态支持非常完整实现在 core/json 模块json、jsonb、json_array/jsonb_array、json_array_length单双参、json_error_position、json_extract/jsonb_extract、-/-运算符、json_insert/jsonb_insert、json_object/jsonb_object、json_patch/jsonb_patch、json_pretty、json_remove/jsonb_remove、json_replace/jsonb_replace、json_set/jsonb_set、json_type单双参、json_valid单双参、json_quote、json_group_array/jsonb_group_array、json_group_object/jsonb_group_object、json_each单双参均为 ✅仅json_tree含 path 形式为 Partial见 json.test 中被注释掉的测试。SQLite C API 支持矩阵C API 是SQLite 兼容的另一大支柱其声明位于 bindings/c/include/sqlite3.h实现位于 bindings/c/src/lib.rs。按功能域划分的现状如下。数据库连接✅sqlite3_open、sqlite3_close、sqlite3_close_v2与 close 相同、sqlite3_db_filename、sqlite3_db_handle、sqlite3_get_autocommit、sqlite3_initialize、sqlite3_shutdown。 sqlite3_open_v2解析 URI 文件名但VFS 参数被忽略。 ❌sqlite3_open16、sqlite3_db_configStub、sqlite3_db_readonly、sqlite3_db_status、sqlite3_db_cacheflush、sqlite3_db_release_memory、sqlite3_db_name、sqlite3_db_mutex、sqlite3_limitStub、sqlite3_config。预处理语句✅sqlite3_prepare_v2、sqlite3_finalize、sqlite3_step、sqlite3_reset、sqlite3_exec、sqlite3_stmt_readonly、sqlite3_next_stmt。 sqlite3_prepare_v3委托给 prepare_v2prepFlags 被忽略sqlite3_stmt_status支持FULLSCAN_STEP、SORT、VM_STEP、REPREPARE、LIBSQL_STMTSTATUS_ROWS_READ、LIBSQL_STMTSTATUS_ROWS_WRITTEN对AUTOINDEX、RUN、FILTER_MISS、FILTER_HIT、MEMUSED返回 0。 ❌sqlite3_prepare、sqlite3_prepare16、sqlite3_prepare16_v2、sqlite3_stmt_busyStub、sqlite3_sql、sqlite3_expanded_sqlStub、sqlite3_normalized_sql。参数绑定✅sqlite3_bind_parameter_count/name/index、sqlite3_bind_null/int/int64/double/text/blob、sqlite3_clear_bindings。 ❌sqlite3_bind_text16/text64/blob64/value/pointer/zeroblob/zeroblob64。结果列与结果值✅sqlite3_column_count/name/decltype/type/int/int64/double/text/blob/bytes/value/table_name、sqlite3_data_countsqlite3_value_type/int/int64/double/text/blob/bytes/dup/free。 ❌ 16 位字符变体column_name16、column_text16、value_text16等、sqlite3_column_database_name、sqlite3_column_origin_name、sqlite3_value_nochange/frombind/subtype/pointer/encoding/numeric_type。错误处理✅sqlite3_errcode、sqlite3_errmsg、sqlite3_errstr、sqlite3_extended_errcode。 ❌sqlite3_errmsg16、sqlite3_extended_result_codes、sqlite3_error_offset、sqlite3_system_errno。变更计数与行 ID✅sqlite3_changes、sqlite3_changes64、sqlite3_total_changes、sqlite3_total_changes64、sqlite3_last_insert_rowid❌sqlite3_set_last_insert_rowid。内存管理✅sqlite3_malloc、sqlite3_malloc64、sqlite3_free❌sqlite3_realloc、sqlite3_realloc64、sqlite3_msize、sqlite3_memory_used、sqlite3_memory_highwater、sqlite3_soft_heap_limit64、sqlite3_hard_heap_limit64、sqlite3_release_memory。回调函数✅sqlite3_busy_handler、sqlite3_busy_timeout、sqlite3_progress_handler仅 step 级回调❌sqlite3_trace_v2Stub、sqlite3_set_authorizerStub、sqlite3_commit_hook、sqlite3_rollback_hook、sqlite3_update_hook、sqlite3_preupdate_hook、sqlite3_unlock_notify、sqlite3_wal_hook。用户自定义函数UDF这是 C API 中缺口最大的域sqlite3_create_function、sqlite3_create_function_v2Stub、sqlite3_create_function16、sqlite3_create_window_functionStub、sqlite3_aggregate_contextStub、sqlite3_user_dataStub、sqlite3_get_auxdata、sqlite3_set_auxdata、以及几乎全部sqlite3_result_*系列result_null/int/double/text/blob/value/error/error_code等多数为 Stub均为 ❌。仅sqlite3_context_db_handle✅。结论依赖 UDF 的应用目前无法在 C API 层面迁移——但可以改用 Turso 的原生扩展机制见下文 Extensions。排序规则✅sqlite3_stricmp、sqlite3_strnicmp❌sqlite3_create_collation、sqlite3_create_collation_v2、sqlite3_create_collation16、sqlite3_collation_needed、sqlite3_collation_needed16。备份、BLOB I/O 与 WAL备份 APIsqlite3_backup_init/step/finish/remaining/pagecount与 BLOB I/Osqlite3_blob_open/close/bytes/read/write/reopen全部为 Stub/❌——大对象增量读写与在线备份暂时不可用。WAL 方向 ✅sqlite3_wal_checkpoint、sqlite3_wal_checkpoint_v2❌sqlite3_wal_autocheckpoint、sqlite3_wal_hook。工具、元数据、虚拟表、可加载扩展、序列化、杂项✅sqlite3_libversion返回3.50.4、sqlite3_libversion_number返回3050004、sqlite3_threadsafe返回 1、sqlite3_interrupt、sqlite3_get_table、sqlite3_free_table、sqlite3_table_column_metadata。❌sqlite3_sourceid、sqlite3_completeStub、sqlite3_sleepStub、sqlite3_randomness、sqlite3_mprintf/vmprintf/snprintf/vsnprintf、sqlite3_strglob/strlike。虚拟表模块 API 全部 ❌sqlite3_create_module、sqlite3_create_module_v2、sqlite3_drop_modules、sqlite3_declare_vtab、sqlite3_overload_function、sqlite3_vtab_config、sqlite3_vtab_on_conflict等——即用户通过 C API 注册自定义虚拟表模块目前不可行内置虚拟表不受影响。可加载扩展 API 全部 ❌sqlite3_load_extension、sqlite3_enable_load_extension、sqlite3_auto_extension等。序列化sqlite3_serialize/sqlite3_deserialize为 Stub杂项如sqlite3_keyword_*、sqlite3_txn_state、sqlite3_file_control、sqlite3_status/status64、sqlite3_log均 ❌。Turso 专属 C API 扩展为支持复制与同步场景Turso 额外提供了四个 libsql 前缀的 WAL 接口均 ✅libsql_wal_frame_count获取 WAL 帧数libsql_wal_get_frame从 WAL 提取帧libsql_wal_insert_frame向 WAL 插入帧libsql_wal_disable_checkpoint禁用 checkpointSQLite VDBE 操作码Turso 采用编译为 SQLite VDBE 字节码再执行的架构cli/opcodes_dictionary.rs 内置了 189 条操作码的描述字典。COMPAT.md 逐条列出了操作码支持情况绝大多数为 ✅如Add、AggStep、Column、Compare、Eq、Found、Function、Goto、Halt、IdxInsert、MakeRecord、NewRowid、Next、OpenRead、OpenWrite、ResultRow、Rewind、Seek*系列、Sorter*系列、Transaction、VFilter等典型缺口包括❌Clear、Expire、Explain、IfZero、IncrVacuum、IsUnique、LoadAnalysis、Param、Permutation、ResetCount、RowKey、SCopy、Seek、Sort、TableLock、Trace。ReadCookie不支持 IncrementalVacuum cookie、ResetSorter尚不支持 sorter 游标仅临时表、Vacuum。String标记为 NotNeededSQLite 用String处理定长字符串、String8处理 NUL 结尾字符串而 Turso 的字符串全部是定长的。对读者而言操作码矩阵更多是内部实现证据它说明 Turso 不是语法翻译而是真正在 VDBE 指令层面逐条对齐 SQLite 的语义。SQLite 日志模式Journaling Modes文档明确表示目前没有计划支持回滚日志模式因为它在写入期间会锁住数据库文件。因此所有回滚型模式delete、truncate、persist、memory均标记为Not Needed日志模式状态wal✅ Yeswal2❌ NoSQLite 中的实验特性delete/truncate/persist/memoryNot Needed也就是说Turso 只支持 WAL 模式这对并发读写更友好但从 SQLite 迁移时需注意原先使用回滚日志模式的应用需要适配 WAL 的行为差异。扩展ExtensionsTurso 采用树内扩展机制源码见 extensions 目录如 extensions/regexp、extensions/csv 等扩展函数无需加载.so即可使用。UUIDUUID 默认以blob存储。支持uuid4()UUID v4、uuid4_str()UUID v4 字符串别名gen_random_uuid()以兼容 PostgreSQL、uuid7(X?)UUID v7可选参数为自纪元起的秒数、uuid7_timestamp_ms(X)UUID v7 转毫秒时间戳、uuid_str(X)UUID 转字符串、uuid_blob(X)UUID 转 blob。相关实现见 core/uuid.rs。regexp与 sqlean-regexp 兼容regexp(pattern, source)、regexp_like(source, pattern)、regexp_substr(source, pattern)、regexp_capture(source, pattern[, n])、regexp_replace(source, pattern, replacement)全部支持extensions/regexp。这意味着REGEXP运算符(NOT) REGEXP✅也有完整后端支撑。Vector与 libSQL 原生向量检索兼容vector(x)、vector32(x)、vector64(x)、vector_extract(x)、vector_distance_cos(x, y)、vector_distance_l2(x, y)欧氏距离、vector_concat(x, y)、vector_slice(x, start_index, end_index)。底层实现在 core/vector含 vector_types 与 operations以及 core/index_method/toy_vector_sparse_ivf.rs 等索引方法中。Time与 sqlean-time 兼容的完整时间扩展约 40 个函数构造类time_now()、time_date(...)、time_unix/time_milli/time_micro/time_nano读取类time_get_*系列与通用time_get(t, field)换算类time_to_unix/milli/micro/nano比较类time_after/before/compare/equal运算类time_add、time_add_date、time_sub、time_since、time_until截断/舍入time_trunc字段/时长两种签名、time_round格式化/解析time_fmt_iso/datetime/date/time、time_parse以及时长常量dur_ns/us/ms/s/m/h。全文检索FTSTurso没有采用 SQLite 的 FTS3/FTS4/FTS5而是用 Tantivy 实现了自己的 FTS✅CREATE INDEX ... USING ftsTurso 专属语法、fts_match()、fts_score()BM25 相关性打分、fts_highlight()、MATCH运算符❌ SQLite FTS3/FTS4/FTS5、snippet()迁移提示依赖 SQLite FTS5 语法如snippet()、bm25()的应用需要改写为 Turso FTS API。相关实现见 core/index_method/fts。CSV、百分位、表值函数与内部虚拟表CSV提供 RFC 4180 兼容的 CSV 虚拟表CREATE VIRTUAL TABLE ... USING csv(...)extensions/csv。Percentilemedian(X)、percentile(Y,P)、percentile_cont(Y,P)、percentile_disc(Y,P)core/percentile.rs。表值函数generate_series(start, stop[, step])✅全部参数支持carray()❌C API 专属。内部虚拟表sqlite_dbpage只读不支持 attach。迁移决策参考综合整个兼容性矩阵可以给出如下务实的评估框架文件层SQLite 文件格式完全支持sqlite_version()/sqlite3_libversion()报告 3.50.4存量数据库可直接打开——这是四项保证中的第二项。SQL 层常规 CRUD、事务、索引、触发器、视图、UPSERT、RETURNING、完整 JSON 函数族、日期时间函数等主路径均可放心使用需要评估的是WITH RECURSIVE、窗口函数高级框架、WITHOUT ROWID写操作、GENERATED列、原地VACUUM等 Partial 特性以及INSTEAD OF触发器❌。C API 层基础连接、预处理语句、绑定、取值、错误处理、WAL checkpoint 可用UDF、自定义排序、虚拟表模块、可加载扩展、备份 API、BLOB I/O 暂不可用——凡重度依赖这些能力的应用迁移前需要重新架构例如用 Turso 树内扩展替代 UDF。数据与语义层注意 UTF-8 文本限制存量非法 UTF-8 数据、同连接多写语句的SQLITE_BUSY、rollback-only 事务语义、MVCC 下写提交的延迟窗口以及只支持 WAL 日志模式。回退路径四项保证承诺任何不兼容的 Turso 特性都需要 opt-in并尽可能提供回到 SQLite 的迁移路径因此迁移不是单向赌注——这也是评估风险时的最大安全网。如需进一步深入可继续阅读 COMPAT.md 原文、sqlite/conformance 的差分测试语料、bindings/c 的 C API 头文件与实现以及 core 下各功能模块的源码。【免费下载链接】tursoA SQL database in Rust: SQLite-compatible, now also speaking Postgres (experimental). The LLVM of databases.项目地址: https://gitcode.com/GitHub_Trending/tu/turso创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表