sql >> Databasteknik >  >> RDS >> Mysql

Jämför strängar med en som har tomma utrymmen tidigare medan den andra inte har det

CHAR-typer fyller strängen till längden av fältet med nollbyte (medan VARCHAR lägger till avgränsare för att indikera slutet av strängen - och ignorerar därmed extra data i slutet (Jag menar tomma bytes )), och därför kommer jämförelser som har mellanslag i slutet att ignorera dessa. Ledande utrymmen är relevanta eftersom de ändrar själva strängen. Se Christophers svar.

EDIT:ytterligare fördjupning krävs

Se några praktiska prov nedan. VARCHAR-typer lägger till mellanslag till strängen, medan CHAR-fält, även om de fyller strängen upp till dess storlek med mellanslag, ignorerar dem under jämförelser. Se specifikt den andra raden med LENGTH funktionsfråga:

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)

där MySQL anger CHAR-fältet, med värdet 'a' som det infogades, har bara 1 tecken långt. Dessutom, om vi sammanfogar lite 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)

du kan se att, eftersom VARCHAR lagrar var strängen slutar, förblir utrymmet på sammanlänkningar - vilket inte gäller för CHAR-typer. Tänk nu på föregående LENGTH exempel, där linje två har olika längd för sina fält a och b, testar vi:

mysql> SELECT * FROM test WHERE a=b;
+------+------+
| a    | b    |
+------+------+
| a    | a    | 
| a    | a    | 
|  a   |  a   | 
+------+------+
3 rows in set (0.00 sec)

Därför kan vi summera att CHAR-datatypen ignorerar och trimmar extra utrymme i slutet av sin sträng, medan VARCHAR inte gör det - förutom vid jämförelser :

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)

Så, gäller samma sak för CHAR-typen?

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)

Vilket visar att CHAR- och VARCHAR-typerna har olika lagringsmetoder, men följer samma regler för ren strängjämförelse . Efterföljande mellanslag ignoreras; medan inledande mellanslag ändrar själva strängen.



  1. MySQL-fel För många anslutningar

  2. MYSQL - turkisk karaktär

  3. hur sammanfogar man två kolumner till en med det befintliga kolumnnamnet i mysql?

  4. Installera webbserver i Windows XP med Apache2, PHP5 och MySQL4 – Del 1