Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

So sánh các chuỗi với một chuỗi có khoảng trống trước đó trong khi chuỗi kia thì không

Loại CHAR điền vào chuỗi theo độ dài của trường với byte rỗng (trong khi VARCHAR thêm dấu phân cách để biểu thị phần cuối của chuỗi - do đó bỏ qua dữ liệu bổ sung ở cuối ( Ý tôi là các byte trống )), và do đó các so sánh có khoảng trắng ở cuối sẽ bỏ qua những so sánh đó. Khoảng trắng ở đầu có liên quan khi chúng thay đổi chính chuỗi. Xem câu trả lời của Christopher.

CHỈNH SỬA:cần thêm một số chi tiết

Xem một số thử nghiệm thực tế bên dưới. Các kiểu VARCHAR thêm khoảng trắng vào chuỗi, trong khi các trường CHAR, mặc dù chúng lấp đầy chuỗi theo kích thước của nó bằng khoảng trắng, hãy bỏ qua chúng trong khi so sánh. Xem cụ thể dòng thứ hai với LENGTH truy vấn hàm:

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)

trong đó MySQL chỉ ra trường CHAR, với giá trị là 'a' khi nó được chèn vào, chỉ có 1 ký tự. Hơn nữa, nếu chúng ta nối một ít dữ liệu:

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)

bạn có thể thấy rằng, vì VARCHAR lưu trữ nơi chuỗi kết thúc, nên khoảng trống vẫn nằm trên các đoạn nối - điều này không đúng với các kiểu CHAR. Bây giờ, hãy ghi nhớ LENGTH trước đó ví dụ, trong đó dòng hai có độ dài khác nhau cho các trường a và b của nó, chúng tôi kiểm tra:

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

Do đó, chúng tôi có thể tóm tắt rằng kiểu dữ liệu CHAR bỏ qua và cắt bớt khoảng trắng ở cuối chuỗi của nó, trong khi VARCHAR thì không - ngoại trừ trong khi so sánh :

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)

Vì vậy, điều này có đúng với loại CHAR không?

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)

Điều này cho thấy rằng loại CHAR và VARCHAR có các phương thức lưu trữ khác nhau, nhưng tuân theo các quy tắc giống nhau để so sánh chuỗi tuyệt đối . Dấu cách ở cuối bị bỏ qua; trong khi các khoảng trắng ở đầu tự sửa đổi chuỗi.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:Quyền truy cập bị từ chối đối với người dùng 'test' @ 'localhost' (sử dụng mật khẩu:CÓ) ngoại trừ người dùng root

  2. lỗi chạy apache sau khi cài đặt xampp

  3. Cách tốt nhất để lưu trữ tên danh mục từ php trong bảng mysql

  4. cách xóa các giá trị trùng lặp trong bảng mysql

  5. Thiết kế cơ sở dữ liệu:Nhiều bảng so với một bảng duy nhất