Typy CHAR wypełniają ciąg do długości pola bajtami null (podczas gdy VARCHAR dodaj ograniczniki, aby wskazać koniec ciągu - ignorując w ten sposób dodatkowe dane na końcu (mam na myśli puste bajty )), a zatem porównania, które mają na końcu spacje, zignorują je. Spacje wiodące są istotne, ponieważ zmieniają sam ciąg. Zobacz odpowiedź Christophera.
EDYCJA:wymagane dalsze opracowanie
Zobacz kilka praktycznych testów poniżej. Typy VARCHAR dodają spacje do łańcucha, podczas gdy pola CHAR, mimo że wypełniają łańcuch do jego rozmiaru spacjami, ignorują je podczas porównywania. Zobacz konkretnie drugą linię z LENGTH
zapytanie funkcji:
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)
gdzie MySQL podaje, że pole CHAR z wstawioną wartością 'a' ma tylko 1 znak długości. Ponadto, jeśli połączymy trochę danych:
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)
widać, że ponieważ VARCHAR przechowuje miejsce, w którym kończy się łańcuch, spacja pozostaje w konkatenacjach - co nie jest prawdziwe dla typów CHAR. Teraz pamiętaj o poprzedniej LENGTH
na przykład, gdzie druga linia ma różne długości pól a i b, testujemy:
mysql> SELECT * FROM test WHERE a=b;
+------+------+
| a | b |
+------+------+
| a | a |
| a | a |
| a | a |
+------+------+
3 rows in set (0.00 sec)
Dlatego możemy podsumować stwierdzenie, że typ danych CHAR ignoruje i przycina dodatkową spację na końcu swojego ciągu, podczas gdy VARCHAR nie - z wyjątkiem podczas porównań :
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)
Czy to samo dotyczy typu 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)
Co pokazuje, że typy CHAR i VARCHAR mają różne metody przechowywania, ale stosują te same zasady dla zwykłego porównywania ciągów . Spacje końcowe są ignorowane; podczas gdy wiodące spacje modyfikują sam ciąg.