字元數據和 C 字串

指向可變長度字元資料的輸入參數(如欄位名稱、動態參數和字串屬性值)會有一個相關的長度參數。 若應用程式以 null 字元終止字串,如 C 語言中常見的情況,則以字串的位元元組長度(不含 null 終止符)或 SQL_NTS(Null-Terminated 字串)作為參數。 非負長度參數則指定相關字串的實際長度。 長度參數可為 0,以指定零長度字串,這與 NULL 值不同。 負值SQL_NTS指示驅動程式透過尋找空終止字元來決定字串長度。

當字元資料從驅動程式回傳給應用程式時,驅動程式必須始終對其進行空終端處理。 這讓應用程式可以選擇將資料處理為字串還是字元陣列。 若應用程式緩衝區容量不足以回傳所有字元資料,驅動程式會將其截斷為緩衝區的位元組長度減去空終止字元所需的位元組數,對截斷資料進行空終端,並將其儲存在緩衝區中。 因此,應用程式必須在用於擷取字元資料的緩衝區中,為空終端字元分配額外空間。 例如,需要一個 51 位元組的緩衝區來取得 50 個字元的資料。

應用程式與驅動程式在使用 SQLPutDataSQLGetData 分段傳送或檢索長字元資料時,必須特別注意。 若資料以一連串空終止字串傳遞,必須先剝離這些字串的空終止字元,才能重新組合資料。

許多 ODBC 程式設計師會混淆字元資料與 C 字串。 此現象是使用 C 語言定義 ODBC 函式時的假象。 如果 ODBC 的驅動程式或應用程式使用其他語言——請記得 ODBC 是語言獨立的——這種混淆就比較不容易發生。

當使用 C 字串來儲存字元資料時,空終止字元不被視為資料的一部分,也不會計入其位元組長度。 例如,字元資料「ABC」可以被記為 C 字串「ABC\0」或字元陣列 {'A', 'B', 'C'}。 資料的位元組長度為 3,無論它是字串還是字元陣列。

雖然應用程式和驅動程式通常使用 C 字串(null 終止字元陣列)來儲存字元資料,但其實並不需要這麼做。 在 C 語言中,字元資料也可以被視為字元陣列(無零終止),其位元組長度會分別在長度/指示緩衝區中傳遞。

由於字元資料可以存放在非空終止陣列中,且其位元組長度可分別傳遞,因此可以將空字元嵌入字元資料中。 然而,ODBC 函式在此情況下的行為未定義,且驅動程式是否正確處理則需依驅動程式而異。 因此,互通的應用程式應始終處理可能包含內嵌空字元的字元資料,作為二進位資料。