Jenis CHAR mengisi string dengan panjang bidang dengan byte nol (sementara VARCHAR menambahkan pembatas untuk menunjukkan akhir string - sehingga mengabaikan data tambahan di akhir (Maksud saya byte kosong )), dan oleh karena itu perbandingan yang memiliki spasi di akhir akan mengabaikannya. Spasi utama relevan karena mereka mengubah string itu sendiri. Lihat jawaban Christopher.
EDIT:beberapa elaborasi lebih lanjut diperlukan
Lihat beberapa tes praktis di bawah ini. Jenis VARCHAR memang menambahkan spasi ke string, sementara bidang CHAR, meskipun mereka mengisi string hingga ukurannya dengan spasi, abaikan saja selama perbandingan. Lihat secara khusus baris kedua dengan LENGTH
kueri fungsi:
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)
di mana MySQL menyatakan bidang CHAR, dengan nilai 'a' saat dimasukkan, hanya memiliki panjang 1 karakter. Selanjutnya, jika kita menggabungkan sedikit data:
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)
Anda dapat melihat bahwa, karena VARCHAR menyimpan di mana string berakhir, ruang tetap pada rangkaian - yang tidak berlaku untuk tipe CHAR. Sekarang, dengan mengingat LENGTH
sebelumnya contoh, di mana garis dua memiliki panjang yang berbeda untuk bidang a dan b, kami menguji:
mysql> SELECT * FROM test WHERE a=b;
+------+------+
| a | b |
+------+------+
| a | a |
| a | a |
| a | a |
+------+------+
3 rows in set (0.00 sec)
Oleh karena itu, kita dapat menyimpulkan bahwa tipe data CHAR mengabaikan dan memangkas ruang ekstra di akhir string, sedangkan VARCHAR tidak - kecuali selama perbandingan :
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)
Jadi, apakah hal yang sama berlaku untuk tipe 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)
Yang menampilkan bahwa jenis CHAR dan VARCHAR memiliki metode penyimpanan yang berbeda, tetapi mengikuti aturan yang sama untuk perbandingan string belaka . Spasi tambahan diabaikan; sementara spasi di depan memodifikasi string itu sendiri.