KB4055758- 修正:在 SQL Server 中回傳 CHAR 與 BINARY 資料尾尾空白時行為不一致

套用到
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 資料

注意

如果 ANSI_PADDING 在建立 char NULL 欄位時是 ON,則其行為與 NOT NULL 欄位相同:值會以右填充至欄位大小。 如果在建立 char NULL 欄位時 ANSI_PADDING 關閉,則行為類似 varchar 欄位,ANSI_PADDING OFF 設定:尾隨的空白會被截斷。

解決方式

此問題已在以下 SQL Server 的累積更新中得到修正:

Cumulative Update 2 for SQL Server 2017

累積更新9 for SQL Server 2016

Cumulative Update 6 for SQL Server 2016 SP1

Cumulative Update 8 for SQL Server 2014 SP2

Cumulative Update 7 for SQL Server 2014 SP1

關於 SQL Server 的累積更新:

每次新的 SQL Server 累積更新都包含了之前累積更新中包含的所有熱修補與安全修補。 請查看 SQL Server 的最新累積更新:

SQL Server 2017 最新累積更新

SQL Server 2016 最新累積更新

SQL Server 2014 最新累積更新

狀態

Microsoft 已確認,這確實存在於「適用於」區塊的 Microsoft 產品中

參考資料

了解 Microsoft 用來說明軟體更新的術語