字符数据和 C 字符串
引用可变长度字符数据的输入参数(例如列名称、动态参数和字符串属性值)具有关联的长度参数。 如果应用程序以 Null 字符终止字符串(在 C 中很常见),则会以参数形式提供字符串的字节长度(不包括 Null 终止符)或 SQL_NTS(以 Null 字符终止的字符串)。 非负长度参数指定关联字符串的实际长度。 长度参数可以是 0,以指定零长度字符串,该字符串不同于 NULL 值。 负值 SQL_NTS 指示驱动程序通过查找 Null 终止字符来确定字符串的长度。
当字符数据从驱动程序返回到应用程序时,驱动程序必须始终以 Null 字符终止该字符串。 这使应用程序能够选择将数据作为字符串还是字符数组进行处理。 如果应用程序缓冲区不够大,无法返回所有字符数据,驱动程序会将其截断为缓冲区的字节长度减去 Null 终止字符所需的字节数,以 Null 字符终止截断后的数据,并将这些数据存储在缓冲区中。 因此,应用程序必须始终为用于检索字符数据的缓冲区中的 Null 终止字符分配额外的空间。 例如,需要 51 字节的缓冲区才能检索 50 个字符的数据。
使用 SQLPutData 或 SQLGetData 分几个部分发送或检索长字符数据时,应用程序和驱动程序必须特别小心。 如果数据作为一系列以 Null 终止的字符串传递,则必须去除这些字符串上的 Null 终止字符,然后才能重新组合数据。
许多 ODBC 程序员混淆了字符数据和 C 字符串。 这是使用 C 语言定义 ODBC 函数时会发生的情况。 如果 ODBC 驱动程序或应用程序使用另一种语言(请记住 ODBC 与语言无关),则不太可能产生这种混淆。
当 C 字符串用于保存字符数据时,Null 终止字符不会被视为数据的一部分,也不会计入其字节长度。 例如,字符数据“ABC”可以作为 C 字符串“ABC\0”或字符数组 {'A', 'B', 'C'} 保存。 数据的字节长度为 3,无论其被视为字符串还是字符数组。
尽管应用程序和驱动程序通常使用 C 字符串(以 Null 终止的字符数组)来保存字符数据,但不需要这样做。 在 C 中,字符数据还可以被视为字符数组(不以 Null 字符终止),并且其字节长度在长度/指示器缓冲区中单独传递。
由于字符数据可以保存在不以 Null 字符终止的数组中,并且其字节长度单独传递,因此可以在字符数据中嵌入 Null 字符。 但是,在这种情况下,ODBC 函数的行为未定义,并且驱动程序是否能正确处理此行为是特定于驱动程序的。 因此,可互操作的应用程序应始终处理可能包含嵌入 Null 字符的字符数据作为二进制数据。