Chuỗi rỗng: Tại sao hoặc khi nào '' bằng ''?


17

Ai có thể giải thích tại sao

select case when '' = ' ' then 1 else 0 end, LEN(''), LEN(' '), DATALENGTH(''), DATALENGTH(' ');

sản lượng

----------- ----------- ----------- ----------- -----------
1           0           0           0           1

Hậu quả buồn cười của việc này là trong

create table test ( val varchar(10) );
insert into test values( '' );
update test set val = ' ' where val = '';

bản cập nhật thực sự sẽ thay thế chuỗi trống bằng một khoảng trống, nhưng mệnh đề where giữ đúng và thực thi lặp lại của câu lệnh cập nhật cho biết

(1 row(s) affected)

Câu trả lời:


22

Khoảng trống giải thích :

SQL Server tuân theo đặc tả ANSI / ISO SQL-92 (Phần 8.2 ,, Quy tắc chung số 3) về cách so sánh chuỗi với khoảng trắng. Tiêu chuẩn ANSI yêu cầu đệm cho các chuỗi ký tự được sử dụng trong so sánh sao cho độ dài của chúng khớp với nhau trước khi so sánh chúng. Phần đệm ảnh hưởng trực tiếp đến ngữ nghĩa của các vị từ mệnh đề WHERE và HAVING và các phép so sánh chuỗi Transact-SQL khác. Ví dụ, Transact-SQL coi các chuỗi 'abc' và 'abc' là tương đương với hầu hết các hoạt động so sánh.

Ngoại lệ duy nhất cho quy tắc này là vị từ THÍCH. Khi phía bên phải của biểu thức vị từ THÍCH có một giá trị có khoảng trắng ở cuối, SQL Server không đệm hai giá trị này vào cùng một độ dài trước khi so sánh xảy ra. Bởi vì mục đích của vị từ THÍCH, theo định nghĩa, là để tạo điều kiện tìm kiếm mẫu thay vì kiểm tra tính bằng chuỗi đơn giản, điều này không vi phạm phần của đặc tả ANSI SQL-92 đã đề cập trước đó.

Đây là một ví dụ nổi tiếng về tất cả các trường hợp được đề cập ở trên:

DECLARE @a VARCHAR(10)
DECLARE @b varchar(10)

SET @a = '1'
SET @b = '1 ' --with trailing blank

SELECT 1
WHERE 
    @a = @b 
AND @a NOT LIKE @b
AND @b LIKE @a

Dưới đây là một số chi tiết về khoảng trống dấu và LIKEmệnh đề .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.