Hành vi của Varchar với khoảng trắng ở cuối


13

Khi tôi sử dụng một Varchar có khoảng trắng, nó sẽ bỏ qua khoảng trắng ở cuối.

Ví dụ:

declare @X varchar(50)

Điều này...

set  @X= 'John'

... cũng giống như ...

set @X= 'John           '

Nó coi những điều này là bình đẳng. Làm thế nào tôi có thể khiến hệ thống nhận ra chúng là khác nhau?

Câu trả lời:


21

Mọi thứ chỉ theo tiêu chuẩn ANSI:

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 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 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 cho các 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 đề .

NHƯNG nếu bạn muốn khác biệt chúng - bạn có thể quyết định sử dụng DATALENGTHchức năng thay vì LEN, bởi vì

SELECT 1 WHERE LEN('John ') = LEN('John')

sẽ đặt bạn 1 thay vì

SELECT 1 WHERE DATALENGTH('John ') = DATALENGTH('John')

Giải pháp

  • để sử dụng hàm DATALENGTH để khác nhau giữa các chuỗi
  • để truyền chuỗi thành loại NVARCHAR - có thể khai báo loại này thành tham số của SP tốt hơn

Bài đăng ngoạn mục, cuối cùng đã tìm thấy một số thông tin tốt
Gaspa79

-2

Bạn chỉ có thể thêm một khoảng trắng vào điều kiện của bạn.

set @X= 'John           \n'

Trailing Spaces trong chuỗi hàm


5
\nkhông có ý nghĩa trong SQL Server. Nó không được hiểu là một dòng mới. Đây không phải là một câu trả lời cho câu hỏi được hỏi nào.
Martin Smith

@MartinSmith nhưng nó được viết bằng MSDN "Nếu bạn phải có dấu cách trong chuỗi, bạn nên xem xét nối thêm một ký tự khoảng trắng ở cuối, để SQL Server không cắt chuỗi."
Ngáp
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.