【问题标题】:Incorrect value inserted into SQL server table when inserted value is greater than column length当插入值大于列长度时,插入到 SQL Server 表中的值不正确
【发布时间】:2018-06-01 11:54:49
【问题描述】:

情况:

我有一个现有的旧表 [dbo].[Values],它位于 SQL Server 2017 上。

在这张表中,我有 3 列。

  • int tableid(主键)
  • char(8)码
  • 字符 (7) 说明

代码和描述都是自定义数据类型,但都只是 char (8) ,char (7) 没有额外的逻辑。

动作

如果我插入到此表中,其中列代码的插入值大于 8 个字符,我将 * 插入该列。

没有给出错误或警告。

我查看了触发器、约束、策略、表的创建脚本、自定义数据类型。我找不到任何有逻辑表明 if truncate set value = *

问题

sql server 的哪一部分在保存到表中之前会修改值?

【问题讨论】:

  • 你能复制表(即使用相同的 DDL 创建一个 [dbo].[Values2])并尝试那里发生的情况吗?只是为了确保到目前为止没有任何东西逃脱了您的分析。
  • @stickybit - 不是真的。问题“为什么会发生这种情况?”并且答案“因为 X”与问“我知道产品做 X。为什么它是这样设计的”是不同的 Q

标签: sql sql-server sql-server-2017


【解决方案1】:

如果您还使用了不正确的数据类型并从 int 获取隐式转换,您会看到这一点。

CREATE TABLE #T(C CHAR(8))

INSERT INTO #T VALUES (1111111111);

SELECT *
FROM #T

documented behaviour here

解决方案。使用字符串

INSERT INTO #T VALUES ('1111111111');
/*String or binary data would be truncated.*/

这是legacy behaviour,不太可能改变

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
相关资源
最近更新 更多