字符数据和 C 字符串

引用可变长度字符数据的输入参数(如列名、动态参数和字符串属性值)具有关联的长度参数。 如果应用程序将字符串以 null 字符结尾(这在 C 语言中很常见),则它提供的参数可以是字符串的字节长度(不包括 null 终止符)或 SQL_NTS(以 null 结尾的字符串)。 非负长度参数指定关联字符串的实际长度。 长度参数可以是 0 以指定零长度字符串,该字符串不同于 NULL 值。 负值SQL_NTS指示驱动程序通过查找 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 字符作为二进制数据的字符数据。