2016-09-19 21 views
12

truy vấn SQL này:CHỌN chỉ chuỗi rỗng trở lại dẫn với không gian

select c1 from table where c1=''; 

lợi nhuận hàng có c1=' ' (một không gian trống) trong MySQL.

Đây có phải là dự định hoặc lỗi không?

EDIT: vui lòng kiểm tra liên kết SQL Fiddle here và số lượng không gian trong truy vấn SELECT không quan trọng.

+2

Bạn có thể chia sẻ một câu đố sql không? – 1000111

+1

Bạn có chắc chắn nó là KHÔNG GIAN và không TAB? –

+0

Kết quả của "SELECT c1 từ bảng nơi CHAR_LENGTH (c1) = 0" là gì? –

Trả lời

3

Đó là tất cả đã nêu trong tài liệu. Tôi đã trích dẫn những điểm quan trọng ở đây.Nhưng tôi khuyên bạn nên xem toàn bộ số documentation

Giá trị VARCHAR không được đệm khi chúng được lưu trữ. Không gian lưu trữ được giữ lại khi các giá trị được lưu trữ và truy xuất, phù hợp với SQL chuẩn.

Mặt khác, giá trị CHAR được đệm khi chúng được lưu trữ nhưng dấu cách sẽ bị bỏ qua khi được truy xuất.

enter image description here

Tất cả collations MySQL là loại PADSPACE. Điều này có nghĩa là tất cả các giá trị CHAR, VARCHAR và TEXT trong MySQL đều được so sánh mà không tính đến bất kỳ dấu cách nào. "So sánh" trong ngữ cảnh này không bao gồm toán tử đối sánh mẫu LIKE, mà khoảng trắng ở cuối là đáng kể.

Giải thích:Trailing spaces được bỏ qua khi so sánh chuỗi sử dụng toán tử so sánh ('='). Tuy nhiên, khoảng trắng ở cuối có ý nghĩa quan trọng đối với LIKE (pattern matching operator)

3

Nếu cột của bạn là từ loại CHAR chứ không phải VARCHAR, điều này đúng. Trên CHAR-Fields sẽ theo sau khoảng trống khi so sánh bị bỏ qua! Vì vậy,

field = '' 
field = ' ' 

giống nhau.

+2

Thực ra điều này không đúng. VARCHAR không "phớt lờ" những khoảng trống sau. Nếu bạn thêm chúng, chúng sẽ ở đó. Nhưng CHAR trường được cố định chiều rộng. Vì vậy, một trường CHAR (5) sẽ ** luôn luôn ** là 5 ký tự (điền vào chỗ trống nếu cần). –

+0

Tôi đang sử dụng 'varchar' – boh

+0

@boh Khoảng trắng Trailing được bỏ qua khi so sánh với' = '. –

1

Nếu c1CHAR(1), sau đó điều này là đúng, như CHAR cột chiều rộng cố định và sẽ được lấp đầy bằng các đoạn trống nếu cần thiết.

Vì vậy, ngay cả khi bạn đặt '' vào trường CHAR(1), bạn sẽ nhận được ' ' khi SELECT ing. Ngoài ra, lọc cho một chuỗi trống sẽ mang lại ' '.

Vui lòng chấp nhận câu trả lời của Martin Smith, vì ông đã đưa ra gợi ý chính xác trước tôi.

Ngoài ra, theo MySQL documentation, dấu khoảng trắng bị bỏ qua khi so sánh chuỗi với =, vì vậy nếu cột c1 của bạn chỉ chứa không gian (hoặc một trong trường hợp của bạn), nó sẽ được trả lại ngay cả khi bạn lọc WHERE c1 = '':

Đặ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 toán tử =

mysql> SELECT 'a' = 'a ', 'a' LIKE 'a '; 
+------------+---------------+ 
| 'a' = 'a ' | 'a' LIKE 'a ' | 
+------------+---------------+ 
|   1 |    0 | 
+------------+---------------+ 
1 row in set (0.00 sec) 

+0

Trích dẫn này đã được đăng trong câu trả lời của tôi BTW. –

+1

À, tôi hiểu, tôi không nhận thấy câu trả lời của bạn cho đến bây giờ. Sẽ loại bỏ điều này và dẫn đến câu trả lời của bạn, vì đây là giải pháp đúng! –

-3

Hãy thử điều này - hành vi

Select case when c1 = '' then ' ' else c1 end from table ; 
+0

Điều này có nghĩa là gì? –

+0

Nó sẽ chuyển đổi của bạn trống ** ('') ** thành ** '' **. Khác nó sẽ trả về bất cứ chuỗi nào bạn có trong cột đó. Tôi nghĩ rằng nó đã được yêu cầu trong này? –

+0

Tại sao bạn muốn điều đó?Câu hỏi ban đầu không trả về '''' khi cột trống nhưng tại sao 'WHERE c1 = ''' cũng trả về các cột có chứa ''''. Vì vậy, không, đây không phải là câu trả lời cho câu hỏi. Vui lòng đọc lại câu hỏi. –

4

này được ghi chép lại.

Các tài liệu MySQL cho LIKE đề cập

dấu không gian là đáng kể, đó là không đúng đối với CHAR hoặc so sánh VARCHAR thực hiện với toán tử =:

SQL Server works the same way.

2

Hành vi này tuân theo chuẩn ANSI SQL-92. Bất kỳ cơ sở dữ liệu nào phù hợp với tiêu chuẩn này cũng sẽ có hành vi giống nhau. Trích:

3) The comparison of two character strings is determined as fol- 
    lows: 

    a) If the length in characters of X is not equal to the length 
    in characters of Y, then the shorter string is effectively 
    replaced, for the purposes of comparison, with a copy of 
    itself that has been extended to the length of the longer 
    string by concatenation on the right of one or more pad char- 
    acters, where the pad character is chosen based on CS. If 
    CS has the NO PAD attribute, then the pad character is an 
    implementation-dependent character different from any char- 
    acter in the character set of X and Y that collates less 
    than any string under CS. Otherwise, the pad character is a 
    <space>. 

    b) The result of the comparison of X and Y is given by the col- 
    lating sequence CS. 

Vì vậy, theo những thông số kỹ thuật 'abc' = 'abc ''' = ' ' đánh giá là true (nhưng '' = '\t' là sai).

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