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 (整數) 強制轉型 為 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() 來與記憶體不足錯誤區分。