3

値「a」、「b」、および「c」を含む、varchar 20 として定義された列 (c) を持つテーブル (t) があります。

次の sql を実行すると、値が返されます。

select * from table where c = 'a    '

なんで?

何らかの方法でパラメーターをキャスト/トリミングしていると思いますが、なぜですか?

本当にどうやって探すんだろう'a '

4

3 に答える 3

1

これを varchar 列と比較するには、文字列リテラルも varchar 型である必要があります。Varchar は余分な末尾の空白を削除します。変化するため、VARchar です。プレーンの char 型は空白を削除せず、実際には必要に応じてリテラルの末尾に余分なスペースを追加します。これを確認できます (そして、LEN() 関数を使用して検索を修正します。

 declare @a varchar(20) = 'a     '
 select * from t where c = @a and len(@a) = Len(c)
于 2009-09-04T03:36:15.110 に答える
1

ANSI SQL 標準では、末尾のスペースは特別な方法で処理されるように指定されています。

http://support.microsoft.com/default.aspx/kb/316626

http://support.microsoft.com/kb/154886/EN-US/

この動作は、char と varchar の両方で事実上同じです。

于 2009-09-04T03:37:52.300 に答える
0

私は簡単な解決策を使用しました:

declare @a varchar(20) = 'a     '
select * from t where c + '$' = @a  + '$'
于 2011-12-21T16:18:07.583 に答える