【问题标题】:Converting bigint to smallint shows an error将 bigint 转换为 smallint 显示错误
【发布时间】:2019-11-17 22:53:11
【问题描述】:
ALTER TABLE employee 
ALTER COLUMN emp_phoneNo SMALLINT;

我正在尝试将数据类型从 BIGINT 更改为 SMALLINT 并显示此错误:

将表达式转换为数据类型 int 时出现算术溢出错误。

我无法理解出了什么问题。

【问题讨论】:

  • 错误不明白怎么办?错误非常明显,smallintbigint 的最大值/最小值非常大(-32,76832,767-9,223,372,036,854,775,8089,223,372,036,854,775,807)。真的再清楚不过了。对于smallint,您的值太大/太小。
  • 保持原样怎么样。
  • 您必须像@Larnu 所说的那样考虑每种类型的大小。这听起来像是把乘客从一辆满载的公共汽车上载到一辆汽车上。但是,为了提供帮助,并考虑到相关值已经填充到 smallint 中,尝试创建一个新字段 smallint,执行 SQL 查询来更新此字段: update [table] set [new_smallint_field] = cast([bigint_field] as smallint ) 重要的!这可能会导致您的数据库出现完整性问题。祝你好运!
  • 这意味着有一些记录大于 SMALLINT 的最大值。所以它会抛出 Arthimetic 溢出异常。请检查一次数据
  • 感谢您的所有回复。我明白我的愚蠢错误。谢谢!!!

标签: sql-server


【解决方案1】:

您的现有行在该特定列中的值大于新数据类型所允许的值。

您需要更新或删除当前“超大”的行。

(或根本不执行列更改.. 因为您很可能不想丢失信息)

您可以使用此查询找到行:

SELECT 'CurrentlyOverSized' as MyLabel, * FROM dbo.employee WHERE ABS(emp_phoneNo) > 32767

请注意电话号码,例如:5555555555(555-555-5555 的数字)将大于 32767 号码。

即使是 5555555(对于 555-5555(无区号))对于 32767 来说也太大了。

还有

一个有争议的话题。但是用于存储电话号码的数字或字符串...请查看此链接以供思考:

What datatype should be used for storing phone numbers in SQL Server 2005?

我个人认为数字是电话号码的错误数据类型。

无论你做什么,都要保持一致。例如,如果您使用字符串 (varchar(xyz)) ............存储它们时没有额外的字符 5555555555,连字符 555-555-5555 ,点 555.555.5555 .. 或其他我的建议是做同样的事情。

【讨论】:

  • 电话号码没有正确的数字数据类型。许多国家/地区使用前导零作为电话号码;你不能存储在任何数字数据类型中的东西。
  • 我个人同意。但有些人没有……因此我将其标记为一个有争议的话题。正如您所说,如果您需要前导零,那么它的数据类型是错误的。但有些人只想要美国的电话号码。因此,警告和一些争论。
  • 感谢@granadaCoder 的解释。我明白我的错误。现在看起来很傻。但是,再次感谢。
猜你喜欢
  • 2016-09-08
  • 1970-01-01
  • 2015-07-23
  • 2016-11-21
  • 1970-01-01
  • 1970-01-01
  • 2021-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多