尽管数据看似合适,但插入时“字符串或二进制数据将被截断”

Posted

技术标签:

【中文标题】尽管数据看似合适,但插入时“字符串或二进制数据将被截断”【英文标题】:"String or binary data would be truncated" upon insert despite the data seemingly fitting 【发布时间】:2017-01-23 13:06:41 【问题描述】:

我有一张这样的桌子:

CREATE TABLE Customers
(CustomerID int Identity (1,1) NOT NULL PRIMARY KEY,
customerName varchar (50),
Address varchar (255),
Phone int NOT NULL,
Email varchar,
Gender varchar,
Age int, 
);

我尝试像这样插入到这个表中:

Insert into Customers (customerName, Address, Phones, Email, Gender, Age)
Values ('Anosa Seunge', 'Keskuskatu 200', 358-3-4180, 'ijiosd@ao.com', 'Male', 19),
        ('Jihad Christian', '305 - 14th Ave. Suite 3B', 358-1-3688, 'jihado@ao.com', 'Female', 29);

得到了这个错误:

Msg 8152, Level 16, State 14, Line 4
String or binary data would be truncated.
The statement has been terminated.

【问题讨论】:

您希望我们告诉我们哪些值比您尝试放入的字段长吗? 不匹配:您创建了Phone,但尝试填充Phones。这些是实际的命令吗? 很确定 358-3-4180 将被解释为 -3825,因为电话号码是一个 int 字段。您也从未为电子邮件或性别VARCHAR 字段指定长度,使其长度为 1。 您没有为 varchar 列电子邮件和性别指定长度。这意味着它将默认为 1,并且您的电子邮件更长。始终指定 varchar 列的长度。 另外,将电话号码存储为int 是非常可疑的。您永远不会想要将电话号码相加或对它们进行其他数学运算。几乎总是,它们应该存储为字符串(如果您认为它们应该只包含数字,请使用适当的检查约束) 【参考方案1】:

您的 EmailGender 字段的长度为 1,这可能是您想要的 Gender(虽然可能不是基于您的插入语句)但肯定不是 Email

你想要这样的东西:

CREATE TABLE Customers
(CustomerID int Identity (1,1) NOT NULL PRIMARY KEY,
customerName varchar (50),
Address varchar (255),
Phone int NOT NULL,
Email varchar(50),
Gender varchar(50),
Age int, 
);

【讨论】:

真的吗?我认为没有大小的varchar 相当于varchar(255) @ivan_pozdeev 遗憾的是,没有,在某些 DBMS 中它们的默认值更高,但在 SQL Server 中默认为 1 更可笑的是默认长度会根据使用情况发生变化。对于列和变量,它是 1,但参数是 30。谈论混淆......简单的解决方案是明确的。 @SeanLange - 不,不适用于参数。除了CAST and CONVERT 之外,其他地方都是 1。但我同意这很荒谬。 相关:***.com/questions/2241238/…, ***.com/questions/359257/…

以上是关于尽管数据看似合适,但插入时“字符串或二进制数据将被截断”的主要内容,如果未能解决你的问题,请参考以下文章

SQLException : 字符串或二进制数据将被截断

SQL Server字符串或二进制数据将被截断

SQL Server 字符串或二进制数据将被截断

SQL 字符串或二进制数据将被截断,列名

用户将在 SQL Server 中截断字符串或​​二进制数据

字符串或二进制数据将被截断。该语句已终止。不明白为啥? [复制]