选择语句上的“字符串数据,右截断”警告

Posted

技术标签:

【中文标题】选择语句上的“字符串数据,右截断”警告【英文标题】:"String data, right truncation" warning on a select statement 【发布时间】:2010-08-11 13:05:37 【问题描述】:

我正在将 access 2003 数据库升级到 SQL Server Express 2008。表创建正常,数据看起来正常。

我有一个连接到该数据库的 MFC 应用程序。连接到访问时工作正常,但是当我连接到 SQL Server 时,我在选择语句上收到以下错误。

DBMS: Microsoft SQL Server
Version: 10.50.1600
ODBC Driver Manager Version: 03.80.0000
Warning: ODBC Success With Info on field 0.
String data, right truncation

State:01004,Native:0,Origin:[Microsoft][ODBC SQL Server Driver]

返回的数据应该是 8 个字符,但只有 7 个字符,最右边的字符被截断。

访问前端可以正确读取SQL Server中的数据。

SQL Server表中的字段定义为nvarchar,长度为8。

读取字段的代码类似于

CDatabase Database;
CString sSerialNumber = "00000000";
CString SqlString;

CString sDsn = "Driver=SQL Server;Server=server\\db;Database=Boards;Uid=uid;Pwd=pwd;Trusted_Connection=False";
Database.Open(NULL,false,false,sDsn);

CRecordset recset( &Database );
SqlString.Format("Select SerialNumber from boards where MACAddress = '%s'",mac);
recset.Open(CRecordset::forwardOnly,SqlString,CRecordset::readOnly);
recset.GetFieldValue("SerialNumber",sSerialNumber);

在这之后,sSerialNumber 应该是 12345678 但它的 1234567

感谢您的帮助

【问题讨论】:

我们可以假设在数据库中,SerialNumber在底层数据库中存储为12345678吗? 赏金有什么用?在没有新驱动程序的情况下使其工作?为什么会有人想这样做? 【参考方案1】:

我同意这与驱动程序有关。引入了 SQL Server 驱动程序以用于 SQL 2000。SQL Native Client 与 2005 一起出现。理想情况下,对于 2008 数据库,您应该使用最新的 SQL Server Native Client 10.0。较新的驱动程序向后兼容旧版本的 SQL Server。

【讨论】:

【参考方案2】:

将我的驱动程序从 “驱动程序=SQL Server;” 到 Driver=SQL Native Client;

已经解决了问题,但我不确定发生了什么。我会继续研究的

【讨论】:

很可能是驱动程序,我之前遇到过与 CSV 相同的问题。我有一个数据,例如 192.168.1.1,当它迁移到 SQL 时,它变成了 192.1681,但是当更新为使用不同的驱动程序时它可以工作。【参考方案3】:

通过谷歌搜索,我了解到,有时,特别是在 MS SQL Server ODBC 驱动程序 DSN 设置对话框中选中“使用区域设置”时,ODBC 将处理由所有数字组成的字符串,作为一个数字,并像“12345678.00”一样返回它,它不适合你给它的空间。解决方案是在对话框中关闭该设置,或者更永久地在连接字符串中关闭:

 CString sDsn = "Driver=SQL Server;Server=server\\db;Database=Boards;"
               +"Uid=uid;Pwd=pwd;Trusted_Connection=False;Regional=No;"

【讨论】:

OP 是否检查过这是否解决了非本地驱动程序的问题?【参考方案4】:

如果您绝对必须深入挖掘,请创建一个最小的存储过程,该过程将“选择”定义为 varchar(17) 的本地 var - 任何大小都可以超过原始大小的 2 倍。现在调用 sproc 而不是动态 SQL,看看会返回什么。然后你可以用完全相同的大小重复它(nvarchar(8))。如果旧的驱动程序容易混淆,您的小 sproc 可用作简单的数据适配器并稳定输入 - 比摆弄表定义要容易得多。

另外,检查 inreface/connection 类上是否有任何参数/属性来指定字符编码并确保它是 unicode (utf-16)。我假设您的代码已编译为 unicode。如果不是,您需要首先做出决定(Nvarchar 中的 N 表示 unicode,否则它只是 varchar)。你肯定需要两边都匹配的字符编码,否则你会遇到其他虚假错误。

【讨论】:

以上是关于选择语句上的“字符串数据,右截断”警告的主要内容,如果未能解决你的问题,请参考以下文章

字符串数据,右截断 - 使用 Spring Boot 进行休眠

bcp:错误 = [Microsoft][SQL Server Native Client 10.0]字符串数据,右截断

bcp:错误= [Microsoft] [SQL Server Native Client 10.0]字符串数据,右截断

带有 xlsx ( Excel ) 文件的 sql bcp 实用程序

设置警告框样式为带有两个文本输入的警告框,用于收集用户收货地址和联系电话。并选择合适的代理方法,当警告框上的两输入框有一个为空时限制“购买”按钮点击。

执行上一个语句之前会显示Javascript警告框