SQL Server の可変長文字列 (varchar / nvarchar) では、
- ‘AAAA’
というような文字列をデータとして登録した場合、可変長文字列では
- ‘AAAA’
というように設定されている文字列のみが登録されます。
char(10) というような固定長文字列型にデータを入れた場合には、
- ‘AAAA ‘
といった形で空白が付与されて固定長文字列として処理がされます。
それでは、
- ‘AAAA ‘
というようなデータに空白が含まれるものを入れた場合にはどうなるかを本投稿で見ていきたいと思います。
SQL Server では、末尾に空白 (Trailing Spaces) があるデータの扱いについての SET オプションがあります。
SET ANSI_PADDING (Transact-SQL)
ANSI_PADDING では、データの末尾に空白 (スペース) の扱いの制御をおこなっています。
デフォルトでは ON が設定されているため、空白はそのまま利用されます。
そのため、 ‘AAAA ‘ を可変長文字列型に入れた場合には、末尾の空白もそのまま格納されます。
これについては KB で情報が公開されています。
INF: カーソルの末尾の空白を含む文字列
INF: どのように SQL Server に末尾のスペースを含む文字列と比較
ただし、比較については末尾の空白は無視されます。
比較検索条件
比較では後続の空白は無視されます。たとえば、以下はすべて同じです。
IF (SELECT COUNT(*) FROM sys.objects WHERE name = 'SpaceTest') > 0 BEGIN DROP TABLE SpaceTest END GO CREATE TABLE SpaceTest (Col1 varchar(50)) GO INSERT INTO SpaceTest VALUES('AAAA'), ('AAAA ') GO SELECT * FROM SpaceTest WHERE Col1 = 'AAAA' SELECT * FROM SpaceTest WHERE Col1 = 'AAAA ' GO
データとして、
- ‘AAAA’
- ‘AAAA ‘
が格納されている場合、
- SELECT * FROM dummy WHERE Col1 = ‘AAAA’
- SELECT * FROM dummy WHERE Col1 = ‘AAAA ‘
の検索はどちらのパターンも両レコード (‘AAAA’ / ‘AAAA ‘) が検索結果としてヒットします。
スペースまで厳密に判断したい場合には、バイナリとして変換する必要があります。
以下のクエリで実行した場合には ‘AAAA’ のみが検索結果としてヒットします。
SELECT * FROM SpaceTest WHERE CONVERT(binary, Col1) = CONVERT(binary,'AAAA')
注意点としては、末尾のスペースを無視した比較がキー重複として判断されることがある点かと。
- ‘AAAA’
- ‘AAAA ‘
をキー項目として INSERT してみたいと思います。
この場合はキー重複となってしまいます。
あまり末尾に空白 (スペース) を設定することはないかと思いますが、この辺の動作はきちんと理解しておく必要がありそうですね。
う~ん、BINARYやVARBINARYに変換しても、イコールにされてしまいます。。
初心者
16 2月 16 at 16:51