2012-05-08 49 views
8

Nếu hàng cơ sở dữ liệu giống như sau: country = 'usa' và truy vấn i "select * from data where country = 'usa '" nó cũng trả về hàng này. Vì vậy, nó không phải là một trận đấu chính xác.Toán tử so sánh MySQL, dấu cách

Tại sao MySQL thực hiện việc này? Và trong những trường hợp nào khác nó cũng sẽ trả về TRUE khi nó không thực sự đúng?

Trả lời

4

Dấu cách được bỏ qua nếu cột thuộc loại char hoặc varchar; sử dụng like 'usa ' giải quyết các vấn đề

+0

+1, http://dev.mysql.com/doc/refman/5.0/en/char.html, Khi lấy giá trị CHAR, dấu cách sẽ được xóa. –

0

thử nó với like hoặc với điều này

country = 'usa ' AND LENGTH(country) = LENGTH('usa ') 
9

Như đã đề cập trong the manual:

Tất cả collations MySQL là loại PADSPACE. Điều này có nghĩa là tất cả các giá trị CHARVARCHAR trong MySQL đều được so sánh mà không tính đến bất kỳ khoảng trắng cuối nào.

Trong định nghĩa của các nhà điều hành LIKE, nó khẳng định:

Đặc biệt, không gian trailing là đáng kể, đó là không đúng đối với CHAR hoặc VARCHAR so sánh thực hiện với các nhà điều hành =:

Như được đề cập trong this answer:

Hành vi này được xác định trong SQL-92 và SQL: 2008. Với mục đích so sánh, chuỗi ngắn hơn được độn thành độ dài của chuỗi dài hơn.

Từ dự thảo (8.2 < so sánh vị >):

Nếu độ dài bằng ký tự của X là không bằng với chiều dài bằng ký tự của Y, sau đó chuỗi ngắn hơn được thay thế một cách hiệu quả, đúng mục đích so sánh, với bản sao của chính nó đã được mở rộng đến độ dài của chuỗi dài hơn bằng cách nối trên bên phải của một hoặc nhiều ký tự pad, trong đó ký tự pad được chọn dựa trên CS. Nếu CS có đặc tính NO PAD, thì ký tự pad là một ký tự phụ thuộc vào việc triển khai thực hiện khác với bất kỳ ký tự nào trong bộ ký tự của X và Y so khớp với bất kỳ chuỗi nào dưới CS. Nếu không, ký tự pad là một không gian < >.

Bên cạnh những giải pháp tuyệt vời khác:

select binary 'a' = 'a ' 
+0

Câu trả lời rất hay –

+0

@eggyal, Vì vậy, sửa chữa ** là gì? – Pacerier

0

Hướng dẫn sử dụng cho biết:

Tất cả collations của MySQL thuộc loại PADSPACE. Điều này có nghĩa rằng tất cả các giá trị CHAR và VARCHAR trong MySQL được so sánh mà không tính đến bất kỳ dấu cách nào [...] Điều này đúng cho tất cả các phiên bản MySQL và không bị ảnh hưởng bởi chế độ SQL máy chủ.

http://dev.mysql.com/doc/refman/5.5/en/char.html

Nếu bạn cần phải xem xét không gian trống, về cơ bản bạn có để thoát khỏi phân loại ngôn ngữ-aware. Một cách đơn giản là buộc một sự đối chiếu nhị phân. Vui lòng chạy và so sánh:

SELECT 'ab'='ab ', BINARY 'ab'='ab ' 
+0

Quan sát siêu thực: toán tử 'BINARY' ở đây không phải là" buộc một phép đối chiếu nhị phân ", điều này sẽ được thực hiện bằng cách áp dụng mệnh đề' COLLATE * _bin', nhưng thay vào đó là gán toán hạng nonbinary của nó thành chuỗi nhị phân — hiệu ứng của do đó, việc so sánh chính xác là byte-cho-byte, tương tự như những gì mà một phép đối chiếu nhị phân sẽ làm (ngoại trừ các phép đối chiếu nhị phân vẫn là PADSPACE). Người đọc có thể thấy hữu ích khi nhận thức được sự khác biệt này, được giải thích chi tiết hơn trong phần hướng dẫn sử dụng [The _bin and binary Collations] (https://dev.mysql.com/doc/en/charset-binary-collations.html) . – eggyal

+0

Cảm ơn bạn, những giải thích này không bao giờ hết chỗ. Tôi thậm chí sẽ không loại bỏ rằng tôi thực sự đã có "so sánh nhị phân" trong tâm trí nhưng chỉ cần mistyped nó-tôi làm điều đó khá thường xuyên :) –

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