値「a」、「b」、および「c」を含む、varchar 20 として定義された列 (c) を持つテーブル (t) があります。
次の sql を実行すると、値が返されます。
select * from table where c = 'a '
なんで?
何らかの方法でパラメーターをキャスト/トリミングしていると思いますが、なぜですか?
本当にどうやって探すんだろう'a '
これを varchar 列と比較するには、文字列リテラルも varchar 型である必要があります。Varchar は余分な末尾の空白を削除します。変化するため、VARchar です。プレーンの char 型は空白を削除せず、実際には必要に応じてリテラルの末尾に余分なスペースを追加します。これを確認できます (そして、LEN() 関数を使用して検索を修正します。
declare @a varchar(20) = 'a '
select * from t where c = @a and len(@a) = Len(c)
ANSI SQL 標準では、末尾のスペースは特別な方法で処理されるように指定されています。
http://support.microsoft.com/default.aspx/kb/316626
http://support.microsoft.com/kb/154886/EN-US/
この動作は、char と varchar の両方で事実上同じです。
私は簡単な解決策を使用しました:
declare @a varchar(20) = 'a '
select * from t where c + '$' = @a + '$'