2

次の点を考慮してください。

IF OBJECT_ID('tempdb..#CharacterTest') IS NOT NULL
    DROP TABLE #CharacterTest

CREATE TABLE #CharacterTest
(
  [ID] int IDENTITY(1, 1) NOT NULL,
[CharField] varchar(50) NULL 
)


INSERT INTO #CharacterTest (CharField)
VALUES ('DavidIsCool.')
      , ('David')
      , ('Bleh')
      , ('Bleh')
      , ('A')
      , ('A')
      , (' ')
      , ('  ')
      , ('   ')
      , ('    ')
      , ('       ');


Select count(*) RecordCount from  #CharacterTest
SELECT DISTINCT CharField FROM #CharacterTest
SELECT count (DISTINCT CharField) FROM #CharacterTest

2 番目と 3 番目のクエリでは、合計 5 つの値が返されます。

完全にスペースで構成されるレコードが等しいとクエリが示すのはなぜですか? これは照合設定によるものですか?

4

1 に答える 1

2

今まで気づかなかったのですが、ここにあなたの答えがあります...

SQL Server は、文字列をスペースと比較する方法について、ANSI/ISO SQL-92 仕様 (セクション 8.2、一般規則 #3) に従います。ANSI 標準では、比較に使用する文字列を比較する前に文字列の長さが一致するようにパディングが必要です。

また、同じ記事から、これがANSI_PADDING設定によるものであるという私の最初の失敗した仮定に関して:

SET ANSI_PADDING 設定は、SQL Server が文字列を比較する前にパディングするかどうかには影響しません。SET ANSI_PADDING は、テーブルに挿入される値から末尾の空白を削除するかどうかにのみ影響するため、ストレージには影響しますが、比較には影響しません。

于 2013-04-29T19:36:12.300 に答える