Типовете CHAR запълват низа до дължината на полето с нулеви байтове (докато VARCHAR добавя разделители, за да посочи края на низа - по този начин игнорира допълнителни данни в края (Имам предвид празни байтове )), и следователно сравненията, които имат интервали в края, ще ги игнорират. Водещите интервали са подходящи, тъй като променят самия низ. Вижте отговора на Кристофър.
РЕДАКТИРАНЕ:необходимо е допълнително уточняване
Вижте някои практически тестове по-долу. Типовете VARCHAR добавят интервали към низа, докато полетата CHAR, въпреки че запълват низа до неговия размер с интервали, ги игнорират по време на сравнения. Вижте по-специално втория ред с LENGTH
функционална заявка:
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 посочва, че полето CHAR, със стойността на 'a', както е било вмъкнато, има само 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
например, когато ред две има различни дължини за своите полета 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 имат различни методи за съхранение, но следват едни и същи правила за чисто сравнение на низове . Крайните интервали се игнорират; докато водещите интервали променят самия низ.