SQL Server - 後ろにスペースがある場合の文字列の比較について
SQL Server での文字列の比較の方法を知っておこう
今回は SQL Server での文字列の比較の方法について注目してみたいと思います。
SQL Server では文字列を比較する際、比較対象の 2 つの文字列の長さが違った場合、短い方の文字列の後ろにスペースを足して、長さの長い方にあわせてから比較します。
ですので、'AAA' = 'AAA ' は評価すると true になります。
これは ANSI/ISO SQL-92 specification にのっとった仕様でバグではありません。
この比較方法は LIKE 以外の全ての文字列の比較で使われるので注意が必要です。
文字列は後ろのスペースに注意!
例えば、'AAA' と 'AAA ' を unique key constraint 付きのカラムに入れようとすると、エラーになります。
エラーになる場合は気づくのでまだ良いかもしれませんが、次のようなことも起こりえます。
以下のような Table1 と Table2 があったとします。
Table1.Col1 と Table2.Col1 には foreign key のリレーションが設定されています。
この状況で Table1.Col1 に 'AAA' という値があると、Table2.Col1 には 'AAA ' も 'AAA ' も保存可能です。
SQL Server 内では LIKE 以外では上記の値は等しいとみなされるので、SQL で Table1 と Table2 を Col1 で JOIN しても問題なく値は取得できます。
ですが、クライアントプログラムなどで値を比較したりすると想定外の結果になってしまうかもしれません。
スペースは目に見えにくいものなので、カラムに値を入れる前に TRIM してから入れると混乱が避けられて良いと思います。