Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Porównywanie ciągów, z których jeden ma wcześniej puste spacje, a drugi nie

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Proszę zainstalować adapter mysql 'gem install activerecord-mysql-adapter'

  2. Nie mogę znaleźć my.cnf na moim komputerze z systemem Windows

  3. Jedna tabela Mysql z wieloma kolumnami TIMESTAMP

  4. Jak uzyskać wszystkie wartości w kolumnie za pomocą PHP?

  5. Wartość wejściowa w tablicy wstawia pusty rekord w mysql