sqlite3中是否有获取查询结果元数据的等效API函数?
SQLite3获取查询结果元数据的实现方式
SQLite3 提供了与 MySQL mysql_fetch_fields、mysql_num_fields 对等的API,完全支持获取查询结果集的列元数据,不需要拉取完所有数据行就能拿到相关信息。
核心API对应关系
- 对应
mysql_num_fields获取结果集总列数的接口:sqlite3_column_count(),入参为预编译语句句柄sqlite3_stmt*,返回值为int类型的列总数。 - 对应
mysql_fetch_fields获取单列元数据的是一组sqlite3_column_*系列函数,SQLite3没有提供一次性返回所有字段元数据数组的接口,需要按列索引从0开始遍历逐个获取属性。
等价代码示例
以下代码实现和给出的MySQL示例完全一致的列名打印逻辑:
sqlite3_stmt *stmt; // 省略前置逻辑:调用sqlite3_prepare_v2预处理查询SQL、校验执行结果 int fieldsNum = sqlite3_column_count(stmt); for (int i = 0; i < fieldsNum; i++) { const char* col_name = sqlite3_column_name(stmt, i); printf("column [%d] name: %s\n", i + 1, col_name); }
常用元数据扩展接口
除了列名之外,还可以通过同系列接口拿到更丰富的列属性,所有接口第一个参数为sqlite3_stmt*句柄,第二个参数为列索引:
sqlite3_column_name():获取查询返回的列名,会返回AS别名后的名称,和MySQLfields[i].name行为完全一致,无额外编译依赖sqlite3_column_origin_name():获取列在原表中的真实字段名,不受查询语句里AS别名的影响,该接口需要编译SQLite时开启SQLITE_ENABLE_COLUMN_METADATA宏才可正常使用sqlite3_column_table_name():获取列所属的源表名称,依赖上述相同编译宏sqlite3_column_database_name():获取列所属的数据库名称,依赖上述相同编译宏sqlite3_column_decltype():获取列建表时声明的字段类型,表达式计算生成的无来源列会返回NULL,无额外编译依赖sqlite3_column_type():获取当前数据行中该列的实际存储类型,注意SQLite为动态类型系统,该接口需要在调用sqlite3_step()拿到有效数据行后调用才能返回正确结果
注意和MySQL接口的差异:SQLite3的结果元数据绑定在预编译语句
sqlite3_stmt上,在sqlite3_prepare_v2执行成功后,还没开始拉取数据行时,就已经可以获取列数、列名、声明类型这类静态元数据。
内容的提问来源于stack exchange,提问作者mz mz02005
相关产品推荐
相关产品推荐

