尽管数据看似合适,但插入时“字符串或二进制数据将被截断”
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】:
您的 Email
和 Gender
字段的长度为 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/…以上是关于尽管数据看似合适,但插入时“字符串或二进制数据将被截断”的主要内容,如果未能解决你的问题,请参考以下文章