KB4055758 - 修复:在 char 和 BINARY 数据末尾返回尾随空白的不一致行为SQL Server

应用对象
SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use) SQL Server 2016 Enterprise Core - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use) SQL Server 2016 Service Pack 1 SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Enterprise Core - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2014 Service Pack 2 - duplicate (do not use) SQL Server 2017 Developer on Windows SQL Server 2017 Enterprise on Windows SQL Server 2017 Enterprise Core on Windows SQL Server 2017 Standard on Windows

症状

假设你有一个Microsoft SQL Server表,其中包含一个或多个索引。 针对表进行查询时,SQL Server可能会对 CHAR 列和 BINARY 列执行不一致的数据填充。 在 CHAR 和 BINARY 数据列末尾返回尾随空白的不一致行为取决于以下条件:

  • 在 SQL Server 表中创建列时ANSI_PADDING的设置。
  • 对列执行表扫描或索引查找的决定。

原因

在某些情况下,SQL Server可能会执行优化,以便绕过许多操作来更快地传递数据。 出现此问题的原因是,SQL Server无法识别无法对上述方案应用优化。

详细信息

SQL Server的此行为不符合以下文章中所述的行为:使用 Char 和 Varchar 数据

注意

如果在创建字符 NULL 列时ANSI_PADDING为 ON,则其行为与字符 NOT NULL 列相同:值将右填充到列的大小。 如果在创建 char NULL 列时ANSI_PADDING为 OFF,则其行为类似于设置了ANSI_PADDING OFF 的 varchar 列:尾随空白将被截断。

解决方法

以下SQL Server累积更新中修复了此问题:

2017 SQL Server累积更新 2

2016 SQL Server累积更新 9

SQL Server 2016 SP1 的累积更新 6

SQL Server 2014 SP2 的累积更新 8

SQL Server 2014 SP1 的累积更新 7

关于SQL Server的累积更新:

SQL Server的每个新累积更新都包含以前的累积更新中包含的所有修补程序和所有安全修补程序。 查看SQL Server的最新累积更新:

SQL Server 2017 的最新累计更新

SQL Server 2016 年的最新累积更新

SQL Server 2014 年的最新累积更新

状态

Microsoft已确认,这是“适用于”部分中列出的Microsoft产品中的问题

参考资料

了解 Microsoft 用于描述软件更新的术语