【问题标题】:why do I get "arthemtic overflow error converting expression to data type int when converting the below code?为什么在转换以下代码时出现“将表达式转换为数据类型 int 的算术溢出错误?
【发布时间】:2025-12-01 15:25:01
【问题描述】:
Create table COSTUMER(
[Costumer ID] int,
[Costumer Phone number] int,
[Costumer Date of Birth] int,
[Costumer Address] text,
[Costumer Name] varchar(40),
[Costumer Buisness if applicable] varchar(40)
);

我已经创建了 ABOVE 表及其相关的列和行,并尝试通过插入 BELOW 代码将一些数据插入到表中,但不断收到 Msg 8115, Level 16, State 2, Line 1“将表达式转换为data type int" 语句已终止错误。

我一定是做错了什么,但我只是没看到:p

INSERT INTO COSTUMER 
      ([Costumer ID],[Costumer Phone number],[Costumer Date of Birth],[Costumer Address]
     ,[Costumer Name],[Costumer Buisness if applicable]) 
VALUES (24,07956485211,27/08/1993,'311 Fullwell avenue','Mohamed Ahmed','TESCO')

请帮忙

【问题讨论】:

  • 另外,您的表的 Costumer Date of Birth 是 int 并且您正尝试在该字段中保存日期。
  • 你推荐我使用什么数据类型来做 dob?谢谢
  • 你的电话号码超过了INT。
  • 如果您还需要节省时间,请使用DATEDATETIME
  • 我很想知道这是否是专业服装制造商的数据库......

标签: sql sql-server


【解决方案1】:

始终为您存储的数据选择合适的数据类型。在您的情况下,您应该使用 DATEDATETIME 数据类型作为出生日期列。

表定义

Create table COSTUMER(
[Costumer ID]                     INT,
[Costumer Phone number]           VARCHAR(100),  --<-- mostly numbers has a leading Zero INT will not respect that
[Costumer Date of Birth]          DATE,          --<--  DATE data type
[Costumer Address]                VARCHAR(MAX),  --<-- avoid using text it has been deprecated in newer versions
[Costumer Name]                   varchar(40),
[Costumer Buisness if applicable] varchar(40)
);

INSERT 语句

INSERT INTO COSTUMER 
      ([Costumer ID],[Costumer Phone number],[Costumer Date of Birth],[Costumer Address]
     ,[Costumer Name],[Costumer Buisness if applicable]) 
VALUES (24,'07956485211','19930827','311 Fullwell avenue','Mohamed Ahmed','TESCO')

注意

还可以使用多列来存储地址,使用诸如.....的列

AddressLine1 , AddressLine2, AddressLine3, County/Region, City, PostCode, Country

您当前的架构违反了数据库规范化的基本规则。

【讨论】:

  • 但是你给他们留下了错误的电话号码类型,电话号码根本不是数字。您还错过了拼写错误,这些错误会让所有人永远诅咒该表格的创建者。
  • 也可以用谷歌搜索标准英文单词的拼写,它是Customer 而不是Costumer 让生活更轻松:)
  • 我知道我有一些拼写错误,但这不是问题谢谢你的注意。这只是练习而已:))
  • @muistooshort 感谢您指出这一点,我是这么认为的,但从来没有解决过 OP 的代码有这么多问题:(
  • 电话号码使用字符串数据类型,VARCHAR或NVARCHAR,因为大多数电话号码有前导零,078998,有些电话号码可能有连字符-,电话最好使用字符串数据类型数字,因为我认为您不必对电话号码进行任何数学计算,因此无需使用 INT 数据类型。
【解决方案2】:

这是因为您尝试将电话号码插入为 INT。它可能应该是一个 VARCHAR/NVARCHAR 值。

正如 user2989408 所说,出生日期应该是 DATE 或 DATETIME。

【讨论】:

  • 我已经使用此代码将电话号码的数据类型更改为 varchar 和 dob : int 与 date 不兼容现在有什么线索吗?
  • 我相信你的插入应该是这样的:INSERT INTO COSTUMER ([Costumer ID],[Costumer Phone number],[Costumer Date of Birth],[Costumer Address] ,[Costumer Name],[Costumer Buisness if applicable]) VALUES (24,'07956485211','27/08/1993','311 Fullwell avenue','Mohamed Ahmed','TESCO')
【解决方案3】:

算术溢出错误是因为您尝试将数据填充到数据类型不够“大”以容纳您尝试放入其中的数据的列中。换言之,数据类型 INT 的最大值为 2,147,483,647(参考下文)。

根据电话号码的使用方式,我会将其存储为 bigint 而不是 int。 Bigint 将占用 8 个字节的存储空间(以下参考相同),而对于 11 位电话号码(在您的帖子 07956485211 中),CHAR 数据类型将占用 11 个字节,而 varchar 将占用 13 个字节(以下参考)

参考文献:

http://msdn.microsoft.com/en-us/library/ms187745.aspx

http://msdn.microsoft.com/en-us/library/ms176089.aspx

【讨论】: