末尾にスペースがあるVarcharの動作


14

スペースを含むVarcharを使用すると、末尾のスペースが無視されます。

例:

declare @X varchar(50)

この...

set  @X= 'John'

...と同じです...

set @X= 'John           '

これらは等しいと見なします。システムにこれらを異なるものとして認識させるにはどうすればよいですか?

回答:


23

すべてがANSI規格に準拠しています。

末尾の空白の説明

SQL Serverは、文字列とスペースを比較する方法について、ANSI / ISO SQL-92仕様(セクション8.2、、一般規則#3)に従います。ANSI規格では、比較で使用される文字列の長さが一致するように、それらを比較する前にパディングが必要です。パディングは、WHEREおよびHAVING句の述語のセマンティクスと他のTransact-SQL文字列比較に直接影響します。たとえば、Transact-SQLは、文字列 'abc'と 'abc'をほとんどの比較演算で同等と見なします。

このルールの唯一の例外は、LIKE述部です。LIKE述語式の右側に後続スペースのある値が含まれている場合、SQL Serverは比較が行われる前に2つの値を同じ長さに埋め込みません。LIKE述語の目的は、定義により、単純な文字列の等価性テストではなくパターン検索を容易にすることであるため、これは前述のANSI SQL-92仕様のセクションに違反しません。

上記のすべてのケースのよく知られた例を次に示します。

DECLARE @a VARCHAR(10)
DECLARE @b varchar(10)

SET @a = '1'
SET @b = '1 ' --with trailing blank

SELECT 1
WHERE 
    @a = @b 
AND @a NOT LIKE @b
AND @b LIKE @a

末尾の空白とLIKE句の詳細を次に示します。

しかし、あなたがそれらを異なるしたい場合-あなたは使用することを決めることができるDATALENGTH代わりの機能をLENするので、

SELECT 1 WHERE LEN('John ') = LEN('John')

代わりに1を置きます

SELECT 1 WHERE DATALENGTH('John ') = DATALENGTH('John')

解決策

  • DATALENGTH関数を使用して文字列を区別するには
  • 文字列をNVARCHAR型にキャストするには-この型をSPのパラメータに宣言する方がよい場合があります

壮観な投稿、ついにいくつかの良い情報が見つかりました
Gaspa79

-2

条件に空白を追加するだけです。

set @X= 'John           \n'

文字列関数の末尾のスペース


5
\nSQL Serverでは意味がありません。新しい行として解釈されません。これはとにかく尋ねられた質問に対する答えではありません。
マーティン・スミス

@MartinSmithですが、MSDNで記述されています。「文字列の末尾にスペースが必要な場合は、SQL Serverが文字列をトリムしないように、末尾に空白文字を追加することを検討してください。」
Yiping
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.