ここでは、Oracle(だけかどうかは知らない)において、CHARとVARCHAR2型の比較の違いについて検証してみます。
スポンサーリンク
CHARとVARCHAR2型の比較を検証
以下のレコードがあるものとします。
カラム名 | 型 | 値 |
---|---|---|
col1 | char(4) | ‘val1’ |
col2 | char(6) | ‘val1 ‘ |
CHAR(6) の列は固定長なので ‘val1 ‘ のように最後尾に半角スペースに自動で付加されます。
では、以下のSQLではレコードが取得できるか確認してみます。
select * from table1 where col1 = col2
結果は取得することができました。動き的には最後尾をtrimして比較しているようなイメージです。
続いて、以下の条件のレコードも検証してみます。
カラム名 | 型 | 値 |
---|---|---|
col3 | varchar2(5) | ‘val1’ |
col4 | varchar2(8) | ‘val1 ‘ |
同じように以下のSQLで取得できるか確認します。
select * from table1 where col3 = col4
VARCHAR2型の場合は、取得することができませんでした。同じ値とみなしてレコード取得するには trim や rtrim 関数を使う必要があります。
自分で入力したんだから、そりゃちがうもんでしょ!ってオラクルに怒られているような気分です。
select * from table1 where trim(col3) = trim(col4)