Toán tử = là T-SQL không quá "bằng" vì nó là "cùng một từ / cụm từ, theo sự đối chiếu ngữ cảnh của biểu thức" và LEN là "số ký tự trong từ / cụm từ." Không có đối chiếu nào coi các khoảng trống ở cuối là một phần của từ / cụm từ đứng trước chúng (mặc dù chúng coi các khoảng trống ở đầu là một phần của chuỗi mà chúng đứng trước).
Nếu bạn cần phân biệt 'this' với 'this', bạn không nên sử dụng toán tử "là cùng một từ hoặc cụm từ" vì 'this' và 'this' là cùng một từ.
Đóng góp vào cách = hoạt động là ý tưởng rằng toán tử chuỗi-bình đẳng nên phụ thuộc vào nội dung của đối số của nó và vào ngữ cảnh đối chiếu của biểu thức, nhưng nó không nên phụ thuộc vào loại của đối số, nếu chúng đều là kiểu chuỗi .
Khái niệm ngôn ngữ tự nhiên về "đây là cùng một từ" thường không đủ chính xác để có thể được nắm bắt bởi một toán tử toán học như =, và không có khái niệm về kiểu chuỗi trong ngôn ngữ tự nhiên. Bối cảnh (tức là đối chiếu) quan trọng (và tồn tại trong ngôn ngữ tự nhiên) và là một phần của câu chuyện, và các thuộc tính bổ sung (một số có vẻ kỳ quặc) là một phần của định nghĩa = để làm cho nó được xác định rõ ràng trong thế giới phi tự nhiên của dữ liệu.
Về vấn đề loại, bạn sẽ không muốn các từ thay đổi khi chúng được lưu trữ trong các loại chuỗi khác nhau. Ví dụ: các loại VARCHAR (10), CHAR (10) và CHAR (3) đều có thể chứa các đại diện của từ 'cat', và? = 'cat' nên để chúng tôi quyết định xem một giá trị thuộc bất kỳ loại nào trong số này có chứa từ 'cat' hay không (với các vấn đề về trường hợp và trọng âm được xác định bởi đối chiếu).
Phản hồi cho bình luận của JohnFx:
Xem Sử dụng dữ liệu char và varchar trong Sách trực tuyến. Trích dẫn từ trang đó, nhấn mạnh của tôi:
Mỗi giá trị dữ liệu char và varchar có một đối chiếu. Các phép đối chiếu xác định các thuộc tính như các mẫu bit được sử dụng để đại diện cho từng ký tự,
các quy tắc so sánh và độ nhạy đối với cách viết hoa hoặc nhấn giọng.
Tôi đồng ý rằng nó có thể dễ tìm hơn, nhưng nó đã được ghi lại.
Cũng cần lưu ý rằng ngữ nghĩa của SQL, trong đó = liên quan đến dữ liệu trong thế giới thực và bối cảnh so sánh (trái ngược với điều gì đó về các bit được lưu trữ trên máy tính) đã là một phần của SQL trong một thời gian dài. Tiền đề của RDBMS và SQL là sự đại diện trung thực của dữ liệu trong thế giới thực, do đó nó hỗ trợ đối chiếu nhiều năm trước khi những ý tưởng tương tự (chẳng hạn như CultureInfo) xâm nhập vào lĩnh vực của các ngôn ngữ giống như Algol. Tiền đề của những ngôn ngữ đó (ít nhất là cho đến gần đây) là giải quyết vấn đề trong kỹ thuật, không phải quản lý dữ liệu kinh doanh. (Gần đây, việc sử dụng các ngôn ngữ tương tự trong các ứng dụng phi kỹ thuật như tìm kiếm đang có một số bước tiến, nhưng Java, C #, v.v. vẫn đang vật lộn với nguồn gốc phi kinh doanh của chúng.)
Theo tôi, thật không công bằng khi chỉ trích SQL là khác với "hầu hết các ngôn ngữ lập trình." SQL được thiết kế để hỗ trợ một khuôn khổ cho mô hình dữ liệu kinh doanh rất khác với kỹ thuật, vì vậy ngôn ngữ cũng khác (và tốt hơn cho mục tiêu của nó).
Rất tiếc, khi SQL lần đầu tiên được chỉ định, một số ngôn ngữ không có bất kỳ kiểu chuỗi tích hợp nào. Và trong một số ngôn ngữ vẫn còn, toán tử bằng giữa các chuỗi hoàn toàn không so sánh dữ liệu ký tự, nhưng so sánh các tham chiếu! Tôi sẽ không ngạc nhiên nếu trong một hoặc hai thập kỷ nữa, ý tưởng == phụ thuộc vào văn hóa trở thành chuẩn mực.