Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Membandingkan string dengan yang satu memiliki ruang kosong sebelumnya sementara yang lain tidak

Jenis CHAR mengisi string dengan panjang bidang dengan byte nol (sementara VARCHAR menambahkan pembatas untuk menunjukkan akhir string - sehingga mengabaikan data tambahan di akhir (Maksud saya byte kosong )), dan oleh karena itu perbandingan yang memiliki spasi di akhir akan mengabaikannya. Spasi utama relevan karena mereka mengubah string itu sendiri. Lihat jawaban Christopher.

EDIT:beberapa elaborasi lebih lanjut diperlukan

Lihat beberapa tes praktis di bawah ini. Jenis VARCHAR memang menambahkan spasi ke string, sementara bidang CHAR, meskipun mereka mengisi string hingga ukurannya dengan spasi, abaikan saja selama perbandingan. Lihat secara khusus baris kedua dengan LENGTH kueri fungsi:

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)

di mana MySQL menyatakan bidang CHAR, dengan nilai 'a' saat dimasukkan, hanya memiliki panjang 1 karakter. Selanjutnya, jika kita menggabungkan sedikit 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)

Anda dapat melihat bahwa, karena VARCHAR menyimpan di mana string berakhir, ruang tetap pada rangkaian - yang tidak berlaku untuk tipe CHAR. Sekarang, dengan mengingat LENGTH sebelumnya contoh, di mana garis dua memiliki panjang yang berbeda untuk bidang a dan b, kami menguji:

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

Oleh karena itu, kita dapat menyimpulkan bahwa tipe data CHAR mengabaikan dan memangkas ruang ekstra di akhir string, sedangkan VARCHAR tidak - kecuali selama perbandingan :

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)

Jadi, apakah hal yang sama berlaku untuk tipe 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)

Yang menampilkan bahwa jenis CHAR dan VARCHAR memiliki metode penyimpanan yang berbeda, tetapi mengikuti aturan yang sama untuk perbandingan string belaka . Spasi tambahan diabaikan; sementara spasi di depan memodifikasi string itu sendiri.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pilih dari tabel mysql WHERE field='$array'?

  2. Waktu kueri MySQL habis:(70100):Eksekusi kueri terputus

  3. Bagaimana cara menggunakan gabungan penuh luar di laravel 5.0?

  4. bagaimana cara query banyak-ke-banyak?

  5. Perpustakaan musik database MySQL