「詳しくは下のドキュメントを読んでね!!!以上!!!!」という内容ですが、お仕事ではまった内容なので、個人的にメモしておきます。
このドキュメントにもある通り、SQLServerでは、特別に設定をしない限り、末尾の空白はトリムされたものとして、文字列比較をします。たとえば、以下の比較はTRUEとなります。
'AAA' = 'AAA '
ここで注意したいのは、いわゆる空文字と空白文字だけの文字列が同じとして扱われることです。たとえば、以下はスペース5文字と空文字を比較したものですが、これはTRUEです。
' ' = ''
ほとんどのシステムでこの仕様が問題にはならないと思いますが、たとえば以下のような業務上の要請がある場合、考慮が必要になります。
- 空文字と空白文字で業務上の意味合いが異なる
- 末尾に空白のない
'A'
と末尾に空白のある'A '
を明確に区別したい
はっきりいって、わけのわからない仕様だと思いますが、わけのわからない仕様が飛び出してくるのが、システム開発というもの。とくに古いシステムをそのままコンバージョンするような場合、何が出てきてもおかしくないので、気を付けましょう(?)
おまけ
末尾の空白について関連した話題をあげておくと、SQLServerでよく利用される関数にLEN
があります。これは文字列長を返す関数ですが、この関数も末尾の空白を切り捨てる仕様です。
Returns the number of characters of the specified string expression, excluding trailing spaces.
これも空白文字や空文字については注意する必要があります。たとえば、以下は5個のスペースのみからなる文字列をLENの引数にしていますが、この結果は0になります。
SELECT LEN(' ')
上述したようにこの仕様は空文字や空白文字、末尾の空白に業務上の意味合いがあるシステムでは問題になることがあります。気を付けましょう(?)