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_blob → BLOB 结果 sqlite3_column_double → REAL 结果 sqlite3_column_int → 32 位 INTEGER 结果 sqlite3_column_int64 → 64 位 INTEGER 结果 sqlite3_column_text → UTF-8 TEXT 结果 sqlite3_column_text16 → UTF-16 TEXT 结果 sqlite3_column_value → 结果作为 未受保护的 sqlite3_value 对象。 sqlite3_column_bytes → BLOB 或 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_INTEGER、SQLITE_FLOAT、SQLITE_TEXT、SQLITE_BLOB 或 SQLITE_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() 会在内部用于自动执行转换。下表详细说明了应用的转换
内部
类型请求
类型转换 NULL INTEGER 结果为 0 NULL FLOAT 结果为 0.0 NULL TEXT 结果为 NULL 指针 NULL BLOB 结果为 NULL 指针 INTEGER FLOAT 从整数转换为浮点数 INTEGER TEXT 整数的 ASCII 渲染 INTEGER BLOB 与 INTEGER->TEXT 相同 FLOAT INTEGER CAST 为 INTEGER FLOAT TEXT 浮点数的 ASCII 渲染 FLOAT BLOB CAST 为 BLOB TEXT INTEGER CAST 为 INTEGER TEXT FLOAT CAST 为 REAL TEXT BLOB 无变化 BLOB INTEGER CAST 为 INTEGER BLOB FLOAT CAST 为 REAL BLOB TEXT 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 返回和内存不足错误。