小巧。快速。可靠。
三选二。

SQLite C 接口

查询结果值

const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);
double sqlite3_column_double(sqlite3_stmt*, int iCol);
int sqlite3_column_int(sqlite3_stmt*, int iCol);
sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol);
const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
const void *sqlite3_column_text16(sqlite3_stmt*, int iCol);
sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol);
int sqlite3_column_bytes(sqlite3_stmt*, int iCol);
int sqlite3_column_bytes16(sqlite3_stmt*, int iCol);
int sqlite3_column_type(sqlite3_stmt*, int iCol);

摘要

sqlite3_column_blobBLOB 结果
sqlite3_column_doubleREAL 结果
sqlite3_column_int32 位 INTEGER 结果
sqlite3_column_int6464 位 INTEGER 结果
sqlite3_column_textUTF-8 TEXT 结果
sqlite3_column_text16UTF-16 TEXT 结果
sqlite3_column_value结果作为 未受保护的 sqlite3_value 对象。
   
sqlite3_column_bytesBLOB 或 UTF-8 TEXT 结果的大小(以字节为单位)
sqlite3_column_bytes16   →  UTF-16 TEXT 的大小(以字节为单位)
sqlite3_column_type结果的默认数据类型

细节

这些例程返回有关查询当前结果行中单个列的信息。在每种情况下,第一个参数都是指向正在评估的 预处理语句 的指针(由 sqlite3_prepare_v2() 或其变体返回的 sqlite3_stmt*),第二个参数是要返回信息的列的索引。结果集的最左侧列的索引为 0。可以使用 sqlite3_column_count() 确定结果中的列数。

如果 SQL 语句当前没有指向有效行,或者列索引超出范围,则结果未定义。只有在最近一次对 sqlite3_step() 的调用返回 SQLITE_ROW 并且随后没有调用 sqlite3_reset()sqlite3_finalize() 时,才能调用这些例程。如果在 sqlite3_reset()sqlite3_finalize() 之后或在 sqlite3_step() 返回 SQLITE_ROW 以外的值之后调用任何这些例程,则结果未定义。如果在任何这些例程挂起时,从不同的线程调用 sqlite3_step()sqlite3_reset()sqlite3_finalize(),则结果未定义。

前六个接口(_blob、_double、_int、_int64、_text 和 _text16)分别以特定数据格式返回结果列的值。如果结果列最初不是所需的格式(例如,如果查询返回整数但使用 sqlite3_column_text() 接口提取值),则会执行自动类型转换。

sqlite3_column_type() 例程返回结果列初始数据类型的 数据类型代码。返回值是 SQLITE_INTEGERSQLITE_FLOATSQLITE_TEXTSQLITE_BLOBSQLITE_NULL 之一。sqlite3_column_type() 的返回值可用于确定应使用前六个接口中的哪一个来提取列值。只有在对相关值没有发生自动类型转换时,sqlite3_column_type() 返回的值才有意义。类型转换后,调用 sqlite3_column_type() 的结果未定义,但无害。SQLite 的未来版本可能会更改类型转换后 sqlite3_column_type() 的行为。

如果结果是 BLOB 或 TEXT 字符串,则可以使用 sqlite3_column_bytes() 或 sqlite3_column_bytes16() 接口来确定该 BLOB 或字符串的大小。

如果结果是 BLOB 或 UTF-8 字符串,则 sqlite3_column_bytes() 例程返回该 BLOB 或字符串中的字节数。如果结果是 UTF-16 字符串,则 sqlite3_column_bytes() 将字符串转换为 UTF-8,然后返回字节数。如果结果是数值,则 sqlite3_column_bytes() 使用 sqlite3_snprintf() 将该值转换为 UTF-8 字符串,并返回该字符串中的字节数。如果结果为 NULL,则 sqlite3_column_bytes() 返回零。

如果结果是 BLOB 或 UTF-16 字符串,则 sqlite3_column_bytes16() 例程返回该 BLOB 或字符串中的字节数。如果结果是 UTF-8 字符串,则 sqlite3_column_bytes16() 将字符串转换为 UTF-16,然后返回字节数。如果结果是数值,则 sqlite3_column_bytes16() 使用 sqlite3_snprintf() 将该值转换为 UTF-16 字符串,并返回该字符串中的字节数。如果结果为 NULL,则 sqlite3_column_bytes16() 返回零。

sqlite3_column_bytes()sqlite3_column_bytes16() 返回的值不包括字符串末尾的零终止符。为清楚起见:sqlite3_column_bytes()sqlite3_column_bytes16() 返回的值是字符串中的字节数,而不是字符数。

sqlite3_column_text() 和 sqlite3_column_text16() 返回的字符串,即使是空字符串,也始终以零结尾。对于零长度 BLOB,sqlite3_column_blob() 返回的值为 NULL 指针。

sqlite3_column_text16() 返回的字符串始终具有平台本机的字节序,而不管数据库设置的文本编码如何。

警告:sqlite3_column_value() 返回的对象是 未受保护的 sqlite3_value 对象。在多线程环境中,未受保护的 sqlite3_value 对象只能安全地与 sqlite3_bind_value()sqlite3_result_value() 一起使用。如果 sqlite3_column_value() 返回的 未受保护的 sqlite3_value 对象以任何其他方式使用,包括对诸如 sqlite3_value_int()sqlite3_value_text()sqlite3_value_bytes() 等例程的调用,则行为不是线程安全的。因此,sqlite3_column_value() 接口通常仅在 用户定义的 SQL 函数虚拟表 的实现中才有用,而不是在顶级应用程序代码中。

这些例程可能会尝试转换结果的数据类型。例如,如果内部表示形式为 FLOAT 并且请求文本结果,则 sqlite3_snprintf() 会在内部用于自动执行转换。下表详细说明了应用的转换

内部
类型
请求
类型
转换

NULLINTEGER结果为 0
NULLFLOAT结果为 0.0
NULLTEXT结果为 NULL 指针
NULLBLOB结果为 NULL 指针
INTEGERFLOAT从整数转换为浮点数
INTEGERTEXT整数的 ASCII 渲染
INTEGERBLOB与 INTEGER->TEXT 相同
FLOATINTEGER CAST 为 INTEGER
FLOATTEXT浮点数的 ASCII 渲染
FLOATBLOB CAST 为 BLOB
TEXTINTEGER CAST 为 INTEGER
TEXTFLOAT CAST 为 REAL
TEXTBLOB无变化
BLOBINTEGER CAST 为 INTEGER
BLOBFLOAT CAST 为 REAL
BLOBTEXT CAST 为 TEXT,确保零终止符

请注意,当发生类型转换时,先前对 sqlite3_column_blob()、sqlite3_column_text() 和/或 sqlite3_column_text16() 的调用的返回值可能会失效。以下情况下可能会发生类型转换和指针失效

在 UTF-16be 和 UTF-16le 之间的转换始终在原地完成,不会使先前的指针失效,当然,先前指针引用的缓冲区的内容将被修改。其他类型的转换在可能的情况下也会在原地完成,但有时它们是不可能的,在这种情况下,先前的指针将失效。

最安全的策略是以以下方式之一调用这些例程

换句话说,您应该先调用 sqlite3_column_text()、sqlite3_column_blob() 或 sqlite3_column_text16() 将结果强制转换为所需的格式,然后调用 sqlite3_column_bytes() 或 sqlite3_column_bytes16() 来查找结果的大小。不要将对 sqlite3_column_text() 或 sqlite3_column_blob() 的调用与对 sqlite3_column_bytes16() 的调用混合,也不要将对 sqlite3_column_text16() 的调用与对 sqlite3_column_bytes() 的调用混合。

返回的指针在发生上述类型转换之前或在调用 sqlite3_step()sqlite3_reset()sqlite3_finalize() 之前有效。用于保存字符串和 BLOB 的内存空间会自动释放。不要将从 sqlite3_column_blob()sqlite3_column_text() 等返回的指针传递给 sqlite3_free()

只要输入参数正确,这些例程只会因格式转换期间发生内存不足错误而失败。只有以下子集的接口容易出现内存不足错误

如果发生内存不足错误,则这些例程的返回值与列包含 SQL NULL 值时的返回值相同。可以通过在获取可疑返回值后且在同一个 数据库连接 上调用任何其他 SQLite 接口之前立即调用 sqlite3_errcode() 来区分有效的 SQL NULL 返回和内存不足错误。

另请参阅 对象常量函数 列表。