【SQL Server】固定長文字列と可変長文字列の比較について
今日DBをいじっていて気付いた事があったのでメモ。
【概要】
1) 固定長文字列変数に桁数いっぱいの文字列を入れる
2) 可変長文字列変数に①と同じ文字列を格納する
1)と2)を比較演算子で比べると結果はFalseとなる
【環境】
SQL Server 2008 R2
【説明】
<コード例1>
DECLARE @hoge as varchar
SET @hoge = ‘A’
と
DECLARE @fuga as char(3)
SET @fuga = ‘A’
であれば比較すると@hoge≠@fugaになるのは分かる。
Varcharは可変長でcharは固定長だから、上記の場合の変数@fugaには
‘A’の後に空白が2個付け足されて格納されるから、明らかに@hogeとは別物になるからだ。
しかし、次の場合はどうなると思います?
<コード例2>
DECLARE @hoge as varchar
SET @hoge = ‘ABC’
と
DECLARE @fuga as char(3)
SET @fuga = ‘ABC’
この場合は@fugaは文字列長最大まで文字が入力されているので、<コード例1>の場合と違って隙間を埋めるための空白は追加されない。だから@hoge=@fugaになるんじゃないかなーといい加減な考えでコードを書いていたら原因不明のエラーを生んでしまって原因究明まで結構な時間を無駄にしてしまった。
そう、実際には、<コード例2>の場合も@hoge≠@fugaになる。
やっぱり型の違いには気を付けないといけないよね…という話。
※後でよくよく調べてみた。
MSDNを参照すると
「varcharの格納サイズは、入力したデータの実際の長さ + 2 バイトとなります」
って書いてある…
追加の2バイトがあるんだからcharとvarcharでは同じ文字列でも確保される領域サイズは違うんじゃないですか!
知らなかった!恥ずかしい!
参考:char および varchar (Transact-SQL)
https://msdn.microsoft.com/ja-jp/library/ms176089(v=SQL.120).aspx