29

我们正在我们的网站上进行一些性能测试,我们经常收到以下错误:

*** 'C:\inetpub\foo.plex' log message at: 2008/10/07 13:19:58
DBD::ODBC::st execute failed: [Microsoft][SQL Native Client]String data, right truncation (SQL-22001) at C:\inetpub\foo.plex line 25.

第 25 行如下:

SELECT DISTINCT top 20 ZIP_CODE, CITY, STATE FROM Zipcodes WHERE (ZIP_CODE like ?) OR (CITY like ?) ORDER BY ZIP_CODE

最后,这是 perl 代码。

有任何想法吗?

编辑:这里的问题是我在 zip 文件中搜索的字符串“74523%”太长了。如果他们给出五位数,我最终只是不添加%。

4

4 回答 4

27

提供的参数ZIP_CODE(长度)大于ZIP_CODEs 列宽,或者提供的参数CITY(长度)大于CITYs 列宽。

知道为两个?占位符提供的值会很有趣。

于 2008-10-08T15:58:02.103 回答
10

这是 mssql ODBC 驱动程序的一个已知问题。根据微软博客文章:

SQLBindParameter 的 ColumnSize 参数是指 SQL 类型中的字符数,而 BufferLength 是应用程序缓冲区中的字节数。但是,如果 SQL 数据类型是 varchar(n) 或 char(n),应用程序将参数绑定为 SQL_C_CHAR 或 SQL_C_VARCHAR,并且客户端的字符编码为 UTF-8,则可能会得到“字符串数据,右截断" 即使 ColumnSize 的值与服务器上数据类型的大小一致,驱动程序也会出错。发生此错误是因为字符编码之间的转换可能会更改数据的长度。例如,右撇号字符 (U+2019) 在 CP-1252 中编码为单字节 0x92,但在 UTF-8 中编码为 3 字节序列 0xe2 0x80 0x99。

您可以在此处找到完整的文章。

于 2019-06-19T15:52:38.310 回答
2

我通过在“?”上使用转换解决了这个问题,所以我的代码看起来像 convert(char(50),?) 并且消除了截断错误。

于 2016-03-04T18:25:18.187 回答
1

我面临着同样的问题。所以,我创建了一个存储过程并定义了大小,如@FromDate datetime、@ToDate datetime、@BL varchar(50)

在@BL varchar(50) 中定义大小后,我没有遇到任何问题。现在它工作正常

于 2020-11-22T08:13:32.637 回答