我们正在网站上进行一些性能测试,我们收到了以下错误:
*** '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%”这太长了。如果他们给出五位数,我最终只是不添加%。
答案 0 :(得分:22)
为ZIP_CODE
提供的参数(长度)大于ZIP_CODE
列宽,或者为CITY
提供的参数(长度)大于CITY
列宽。
知道为两个?
占位符提供的值会很有趣。
答案 1 :(得分:2)
我通过在“?”上使用转换来解决这个问题,所以我的代码看起来像转换(char(50),?)并且摆脱了截断错误。
答案 2 :(得分:1)
我面临着同样的问题。因此,我创建了一个存储过程并定义了大小 @FromDate日期时间, @ToDate日期时间, @BL varchar(50)
在@BL varchar(50)中定义大小后,我没有遇到任何问题。现在一切正常
答案 3 :(得分:0)
这是mssql ODBC驱动程序的已知问题。根据Microsoft博客文章:
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。
您可以找到完整的文章here。