【SQLを丁寧に理解する】CHARとVARCHAR2【ORACLEの場合】PART4
こんにちは、EightyEightRiceです。
今日の記事は、【SQLを丁寧に理解する】CHARとVARCHAR【ORACLE】PART4です。
データベースを扱い場合に、よくハマってしまう項目について、丁寧に説明していきます。
ざっと読み飛ばすだけでも、
「へぇーそうなんだ」
と、思っていただけるような構成を心がけています。
今回は
CHARとVARCHAR2【ORACLEの場合】PART4
です。
前回までで、
・NULL
・空文字
・TRIM()
を紹介し、SQLの等式での考え方を解説をしました。
今回は「SQLの等式」についてさらに深堀していこうと思います。
以前、記事「CHARとVARCHAR2【ORACLEの場合】PART1」で、
・CHAR = 固定長
・VARCHAR2 = 可変長
というお話をしましたが、これをSQLの等式では、どう扱えばいいのか、
考えていきましょう。
まず、等式での評価(同じか同じでないかの判定)が、特殊なのがCHARです。
おさらいとして、
CHAR型の変数やカラムに値を格納する場合のルールを見てみましょう。
以下、以前の記事の引用です。
==============================
あるカラムの型が
CHAR(5 BYTE)
あった場合、どんな文字や単語を登録しても、5BYTEになります。
(ここで、半角英数は1BYTEBYTE、ひらがなは1BYTEとします。)
どのように登録されるかというと、以下のようになります。
"A" → "A____"
"あいう" → "あいう____"
見えやすく、「 _ 」を使いましたが、実際は半角スペースで埋められます。
==============================
これが、CHARの値の保持、データの持ち方のルールでした。
それを踏まえた上で、CHAR型同士の等式評価のルールも考えましょう。
以下のようなSQLの等式は、TRUEでしょうか、FALSEでしょうか。
・'A' = 'A '
(左辺がCHAR(1)、右辺がCHAR(5)とします。)
実は、この結果は、TRUEと評価されます。
これを理解する為に、以下の比較ルールが必要です。
<CHAR型同士の比較ルール>
CHAR型の変数やカラム同士を比較する場合は、
定義されている長さの大きいほうと同じ長さになるまで、
長さの小さい変数の後ろに半角スペースを付け足してから比較する
つまり、先ほどの等式は以下の様に評価します。
==============================
・'A' = 'A ' ➡ 'A ' = 'A '
(左辺がCHAR(1)、右辺がCHAR(5)とします。)
==============================
左辺が1BYTE、右辺が5BYTEのCHARなので、
左辺の'A'の後ろに4つ半角スペースを付け足します。
したがって、TRUEと評価されるわけです。
以下のようなパターンもすべてTRUEと評価されます。
・'A ' = 'A ' ➡ 'A ' = 'A '
・'ABC ' = 'ABC' ➡ 'ABC ' = 'ABC '
ただし、
・'' = '' ➡ NULL = NULL
でFALSEになるので、注意が必要ですね。
言葉でまとめると、
「CHAR同士の比較は後ろの空白は無視して比較して良い」
という事になります。
以上、解説でした。