字符数据和 C 字符串

引用可变长度字符数据的输入参数(例如列名称、动态参数和字符串属性值)具有关联的长度参数。 如果应用程序以 Null 字符终止字符串(在 C 中很常见),则会以参数形式提供字符串的字节长度(不包括 Null 终止符)或 SQL_NTS(以 Null 字符终止的字符串)。 非负长度参数指定关联字符串的实际长度。 长度参数可以是 0,以指定零长度字符串,该字符串不同于 NULL 值。 负值 SQL_NTS 指示驱动程序通过查找 Null 终止字符来确定字符串的长度。

当字符数据从驱动程序返回到应用程序时,驱动程序必须始终以 Null 字符终止该字符串。 这使应用程序能够选择将数据作为字符串还是字符数组进行处理。 如果应用程序缓冲区不够大,无法返回所有字符数据,驱动程序会将其截断为缓冲区的字节长度减去 Null 终止字符所需的字节数,以 Null 字符终止截断后的数据,并将这些数据存储在缓冲区中。 因此,应用程序必须始终为用于检索字符数据的缓冲区中的 Null 终止字符分配额外的空间。 例如,需要 51 字节的缓冲区才能检索 50 个字符的数据。

使用 SQLPutDataSQLGetData 分几个部分发送或检索长字符数据时,应用程序和驱动程序必须特别小心。 如果数据作为一系列以 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 字符的字符数据作为二进制数据。