小巧、快速、可靠。
三選一。

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 指標
INTEGER (整數)FLOAT (浮點數)從整數轉換為浮點數
INTEGER (整數)TEXT (文字)整數的 ASCII 呈現
INTEGER (整數)BLOB (二進位大型物件)與 INTEGER->TEXT 相同
FLOAT (浮點數)INTEGER (整數) 強制轉型 為 INTEGER
FLOAT (浮點數)TEXT (文字)浮點數的 ASCII 呈現
FLOAT (浮點數)BLOB (二進位大型物件) 強制轉型 為 BLOB
TEXT (文字)INTEGER (整數) 強制轉型 為 INTEGER
TEXT (文字)FLOAT (浮點數) 強制轉型 為 REAL (實數)
TEXT (文字)BLOB (二進位大型物件)無變更
BLOB (二進位大型物件)INTEGER (整數) 強制轉型 為 INTEGER
BLOB (二進位大型物件)FLOAT (浮點數) 強制轉型 為 REAL (實數)
BLOB (二進位大型物件)TEXT (文字) 強制轉型 為 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 值時相同。有效的 SQL NULL 傳回值可以藉由在取得可疑傳回值後,且在對同一個 資料庫連線 呼叫任何其他 SQLite 介面之前,立即呼叫 sqlite3_errcode() 來與記憶體不足錯誤區分。

另請參閱物件常數函式列表。