Mysql
 sql >> база данни >  >> RDS >> Mysql

Сравняване на низове с един, който има празни интервали преди, докато другият не

Типовете 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 имат различни методи за съхранение, но следват едни и същи правила за чисто сравнение на низове . Крайните интервали се игнорират; докато водещите интервали променят самия низ.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SELECT MySQL редове, където днешната дата е между две колони DATE

  2. Как най-добре да съхранявате потребителска информация и потребителско име и парола

  3. Вземете данни между две дати в MySQL

  4. Премахване на HTML тагове от записа

  5. SQL ограничение SELECT, но не JOIN