CHARタイプは、文字列をフィールドの長さまでnullバイトで埋めます (一方、VARCHARは文字列の終わりを示すために区切り文字を追加します-したがって、最後の余分なデータを無視します(私は空のバイトを意味します ))、したがって、最後にスペースがある比較はそれらを無視します。先頭のスペースは、文字列自体を変更するため、関連性があります。クリストファーの答えを参照してください。
編集:さらに詳しく説明する必要があります
以下のいくつかの実用的なテストを参照してください。 VARCHAR型は文字列にスペースを追加しますが、CHARフィールドは文字列をそのサイズまでスペースで埋めますが、比較時には無視します。特にLENGTH
の2行目を参照してください 関数クエリ:
mysql> create table test (a VARCHAR(10), b CHAR(10));
Query OK, 0 rows affected (0.17 sec)
mysql> insert into test values ('a', 'a'), ('a ', 'a '), (' a', ' a');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select a, LENGTH(a), b, LENGTH(b) FROM test;
+------+-----------+------+-----------+
| a | LENGTH(a) | b | LENGTH(b) |
+------+-----------+------+-----------+
| a | 1 | a | 1 |
| a | 2 | a | 1 |
| a | 2 | a | 2 |
+------+-----------+------+-----------+
3 rows in set (0.00 sec)
ここで、MySQLは、挿入されたときの値が「a」であるCHARフィールドの長さが1文字しかないことを示しています。さらに、少しのデータを連結すると:
mysql> select CONCAT(a, '.'), CONCAT(b, '.') FROM test;
+----------------+----------------+
| CONCAT(a, '.') | CONCAT(b, '.') |
+----------------+----------------+
| a. | a. |
| a . | a. |
| a. | a. |
+----------------+----------------+
3 rows in set (0.00 sec)
mysql> select CONCAT(a, b), CONCAT(b, a) FROM test;
+--------------+--------------+
| CONCAT(a, b) | CONCAT(b, a) |
+--------------+--------------+
| aa | aa |
| a a | aa |
| a a | a a |
+--------------+--------------+
3 rows in set (0.00 sec)
VARCHARは文字列の終わりを格納するため、スペースは連結に残ります。これはCHARタイプには当てはまりません。ここで、前のLENGTH
を念頭に置いてください たとえば、2行目のフィールドaとbの長さが異なる場合、次のようにテストします。
mysql> SELECT * FROM test WHERE a=b;
+------+------+
| a | b |
+------+------+
| a | a |
| a | a |
| a | a |
+------+------+
3 rows in set (0.00 sec)
したがって、CHARデータ型は文字列の最後の余分なスペースを無視してトリミングしますが、VARCHARはそうではありません-比較中を除いて、要約できます。 :
mysql> select a from test where a = 'a ';
+------+
| a |
+------+
| a |
| a |
+------+
2 rows in set (0.00 sec)
mysql> select a from test where a = 'a';
+------+
| a |
+------+
| a |
| a |
+------+
2 rows in set (0.00 sec)
mysql> select a from test where a = ' a';
+------+
| a |
+------+
| a |
+------+
1 row in set (0.00 sec)
では、CHARタイプについても同じことが言えますか?
mysql> select a from test where b = 'a ';
+------+
| a |
+------+
| a |
| a |
+------+
2 rows in set (0.00 sec)
mysql> select a from test where b = 'a';
+------+
| a |
+------+
| a |
| a |
+------+
2 rows in set (0.00 sec)
mysql> select a from test where b = ' a';
+------+
| a |
+------+
| a |
+------+
1 row in set (0.00 sec)
これは、 CHARタイプとVARCHARタイプのストレージメソッドが異なるが、文字列の比較については同じルールに従っていることを示しています 。末尾のスペースは無視されます。先頭のスペースは文字列自体を変更します。