これは、多かれ少なかれ予想される動作です。SQL (ISO/ANSI) 標準のコピーから:
2 つの文字列式の比較は、比較に使用される照合によって異なります。長さが等しくない値を比較する場合、比較の照合にNO PAD
特徴があり、短い方の値が長い方の値の接頭辞と等しい場合、短い方の値は長いほうの値よりも小さいと見なされます。比較の照合にPAD SPACE
特性がある場合、比較のために、右側の <space> を連結することにより、短い方の値が長い方の値の長さに効果的に拡張されます。
現在、ほとんどの DBMS は文字列比較を実装していますが、わずかな違いがあります。SQL_Server と MySQL では''
、 、' '
、' '
および' '
(0、1、2、および 3 個のスペースを含む文字列) は、VARCHAR
またはとして定義されているかどうかに関係なく、すべて等しいことがわかりますCHAR
。
Postges では、それらVARCHAR
が等しい場合はすべて等しくありません (したがって、列CHAR
にパディングはありません)。VARCHAR
そのうちの 1 つが VARCHAR と 1 つの CHAR の場合、それらは等しいと判断されるため、比較の前にパディングが行われると思います。
Oracle は Postgres に似ていますが、空の文字列''
が (ほとんどすべての場所で) として動作するという特別な特徴がありますNULL
。したがって、それを 1 つ以上のスペースを含む文字列 (またはそれ自体) と比較すると、結果は True でも False でもなく、UNKNOWN
. Oracle にはもう 1 つの違いがあります。1 つの文字列が として定義されVARCHAR
、もう1 つの文字列が として定義されているCHAR
場合、比較はかなり複雑になります。テストからCHAR
、その場合、(定義されたデータ型)の長さまでのみがパディングされ、 unpadded と比較されると仮定しVARCHAR
ます。
SQL-Fiddleで(4つのDBMSすべて)を確認できます