sql >> Database >  >> RDS >> Mysql

Strings vergelijken met de ene met lege spaties ervoor en de andere niet

CHAR-typen vullen de tekenreeks tot de lengte van het veld met null-bytes (terwijl VARCHAR scheidingstekens toevoegt om het einde van de tekenreeks aan te geven - en dus extra gegevens aan het einde negeert (Ik bedoel lege bytes )), en daarom zullen vergelijkingen met spaties aan het einde deze negeren. Voorloopspaties zijn relevant omdat ze de tekenreeks zelf veranderen. Zie het antwoord van Christopher.

EDIT:enige verdere uitwerking vereist

Zie hieronder enkele praktijktesten. VARCHAR-typen voegen spaties toe aan de tekenreeks, terwijl CHAR-velden, hoewel ze de tekenreeks tot zijn grootte vullen met spaties, ze negeren tijdens vergelijkingen. Zie specifiek de tweede regel met de LENGTH functievraag:

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)

waar MySQL vermeldt dat het CHAR-veld, met de waarde 'a' zoals het was ingevoegd, slechts 1 teken lang is. Verder, als we wat gegevens samenvoegen:

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)

je kunt zien dat, aangezien VARCHAR opslaat waar de string eindigt, de spatie op aaneenschakelingen blijft staan ​​- wat niet geldt voor CHAR-typen. Houd nu rekening met de vorige LENGTH waar regel twee bijvoorbeeld verschillende lengtes heeft voor de velden a en b, testen we:

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

Daarom kunnen we samenvatten dat het CHAR-gegevenstype extra ruimte aan het einde van zijn tekenreeks negeert en trimt, terwijl VARCHAR dat niet doet - behalve tijdens vergelijkingen :

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)

Dus, geldt hetzelfde voor het CHAR-type?

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)

Wat aangeeft dat de CHAR- en VARCHAR-typen verschillende opslagmethoden hebben, maar dezelfde regels volgen voor pure stringvergelijking . Achterliggende spaties worden genegeerd; terwijl voorloopspaties de tekenreeks zelf wijzigen.



  1. Versleutel wachtwoord in R - om verbinding te maken met een Oracle DB met behulp van RODBC

  2. MySQL COALESCE- en NULLIF-functie

  3. MySQL:Wat is een omgekeerde versie van LIKE?

  4. Een logging-handler maken om verbinding te maken met Oracle?