Microsoft SQL Server 2008 R2 (最新のサービス パック/パッチを適用) を使用しており、データベースの照合順序は SQL_Latin1_General_CP1_CI_AS です。
次のコード:
SET ANSI_PADDING ON;
GO
CREATE TABLE Test (
Code VARCHAR(16) NULL
);
CREATE UNIQUE INDEX UniqueIndex
ON Test(Code);
INSERT INTO Test VALUES ('sample');
INSERT INTO Test VALUES ('sample ');
SELECT '>' + Code + '<' FROM Test WHERE Code = 'sample ';
GO
次の結果が生成されます。
(1 行が影響を受けます)
メッセージ 2601、レベル 14、状態 1、行 8
一意のインデックス 'UniqueIndex' を持つオブジェクト 'dbo.Test' に重複するキー行を挿入することはできません。重複キーの値は (sample ) です。
ステートメントは終了されました。
‐‐‐‐‐‐‐‐‐‐‐‐</p>
>サンプル<
(1 行が影響を受けます)
私の質問は次のとおりです。
- インデックスは末尾のスペースを格納できないと思います。この動作を指定/定義する公式ドキュメントを教えてもらえますか?
- この動作を変更する設定はありますか。つまり、'sample' と 'sample' を 2 つの異なる値 (ちなみに) として認識させて、両方をインデックスに含めることができるようにします。
- いったいなぜ SELECT が行を返すのでしょうか? インデックスの一意性を削除すると、両方の INSERT が正常に実行され、SELECT が 2 行を返すため、SQL Server は WHERE 句のスペースを使用して非常に面白い/巧妙なことをしているに違いありません。
正しい方向へのヘルプ/ポインタをいただければ幸いです。ありがとう。