2012-07-02 35 views
9

Rõ ràng là một vấn đề rất hiếm, nhưng IMO cực kỳ khó chịu và SAI: Trailing khoảng trắng trong MySQL không được sử dụng trong so sánh:MySQL làm cho vấn đề khoảng trắng

mysql> SELECT "A" = "A "; 
+------------+ 
| "A" = "A " | 
+------------+ 
|   1 | 
+------------+ 
1 row in set (0.00 sec) 

Điều này đặc biệt có vấn đề trong các tình huống sau:

mysql> SELECT COUNT(*) FROM eq WHERE name != TRIM(name); 
+------------+ 
| COUNT(*) | 
+------------+ 
|   0 | 
+------------+ 
1 row in set (0.00 sec) 

mysql> UPDATE eq SET name=TRIM(name); 
Query OK, 866 row affected (0.01 sec) 
Rows matched: 650907 Changed: 866 Warnings: 0 

Có cách nào để định cấu hình MySQL để xử lý đúng khoảng trắng không?

+1

Một so sánh nhị phân sẽ ngăn chặn loại bỏ các dấu không gian: 'CHỌN Binary 'a' = Binary 'a';' –

Trả lời

2

Bạn có thể sử dụng LIKE

SELECT "A" LIKE "A "; 

sẽ trở về 0 nhưng

SELECT "A" LIKE "A"; 

lợi nhuận 1

6

Theo the manual, một sửa chữa nhanh chóng là sử dụng NHƯ:

Theo tiêu chuẩn SQL, LIKE thực hiện ma tching trên một cơ sở cho mỗi nhân vật, do đó nó có thể tạo ra kết quả khác nhau từ các nhà điều hành = so sánh:

...

Đặc biệt, không gian trailing là đáng kể, đó là không đúng sự thật để so sánh CHAR hay VARCHAR thực hiện với the = operator ...

miễn là bạn không sử dụng bất kỳ ký tự đại diện nào, số này phải giống hệt =. Câu hỏi tràn ngăn xếp này dường như hỗ trợ giả định: Equals(=) vs. LIKE

Hướng dẫn không cho biết liệu STRCMP() có chặt chẽ hơn = về khoảng trắng và không thể thử ngay bây giờ - có thể đáng xem tại, quá, vì nó làm cho nó rõ ràng hơn lý do tại sao= không được sử dụng.

So sánh nhị phân theo đề xuất của tombom cũng là một tùy chọn, nhưng sẽ có các tác dụng phụ khác (như so sánh chặt chẽ hơn của Umlauts, ví dụ: AÄ sẽ khác). Thông tin thêm về ảnh hưởng của việc sử dụng so sánh nhị phân trong this question.

+1

'STRCMP' dường như đóng vai trò giống với '='. Trong khi 'LIKE' cũng chú ý đến cách viết hoa. Cảm ơn! – Mikhail

+0

@Mikhail ahh, vậy không có tác dụng với bạn? Điều đó thật tệ. Sau đó, tôi đoán so sánh nhị phân là cách duy nhất để đi –

2

So sánh nhị phân là từ ảo thuật.

Binary Comparison in MySQL Manual

mysql> SELECT 'a' = 'A'; 
     -> 1 
mysql> SELECT BINARY 'a' = 'A'; 
     -> 0 
mysql> SELECT 'a' = 'a '; 
     -> 1 
mysql> SELECT BINARY 'a' = 'a '; 
     -> 0 
+0

+1, nhưng lưu ý rằng điều này có thể thay đổi hành vi khác cũng như (như so sánh của Umlauts) –

Các vấn đề liên quan