数据长度、缓冲区长度和截断

数据长度是数据的字节长度,因为它存储在应用程序的数据缓冲区中,而不是存储在数据源中。 此区别很重要,因为数据存储在数据缓冲区中的类型通常不同于数据源中的类型。 因此,对于要发送到数据源的数据,这是转换为数据源类型之前数据的字节长度。 对于从数据源检索的数据,这是转换为数据缓冲区类型之后以及完成任何截断之前的数据的字节长度。

对于固定长度的数据(如整数或日期结构),数据的字节长度始终为数据类型的大小。 通常,应用程序分配的数据缓冲区是数据类型的大小。 如果应用程序分配较小的缓冲区,则后果是未定义的,因为驱动程序假定数据缓冲区是数据类型的大小,并且不会截断数据以适应较小的缓冲区。 如果应用程序分配较大的缓冲区,则永远不会使用额外的空间。

对于可变长度数据(例如字符或二进制数据),必须认识到数据的字节长度独立于且不同于缓冲区的字节长度。 缓冲区部分描述了这两个长度的关系。 如果数据的字节长度大于缓冲区的字节长度,驱动程序会将提取的数据截断到缓冲区的字节长度,并使用 SQLSTATE 01004(数据已截断)返回 SQL_SUCCESS_WITH_INFO。 但是,返回的字节长度是未截断数据的长度。

例如,假设应用程序为二进制数据缓冲区分配 50 个字节。 如果驱动程序要返回 10 字节的二进制数据,则会在缓冲区中返回这 10 个字节。 数据的字节长度为 10,缓冲区的字节长度为 50。 如果驱动程序要返回 60 字节的二进制数据,它将数据截断为 50 字节,在缓冲区中返回这些字节,并返回 SQL_SUCCESS_WITH_INFO。 数据的字节长度为 60(截断之前的长度),缓冲区的字节长度仍为 50。

将为已截断的每列创建诊断记录。 由于驱动程序创建这些记录以及应用程序处理它们需要时间,因此截断可能会降低性能。 通常,应用程序可以通过分配足够大的缓冲区来避免此问题,不过使用长数据时可能无法执行此操作。 发生数据截断时,应用程序有时会分配更大的缓冲区并重新提取数据;并非所有情况都如此。 如果在调用 SQLGetData 来获取数据时发生截断,应用程序不需要为已返回的数据调用 SQLGetData;有关详细信息,请参阅“获取长数据”。