物流・倉庫・WMS・プログラマ日記

物流・倉庫・WMS・プログラマ日記

在庫管理・倉庫管理を扱う事が多いプログラマの備忘録です。

【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同士の比較は後ろの空白は無視して比較して良い」

という事になります。

 

以上、解説でした。

関連記事

記事一覧