= 연산자는 T-SQL이 "표현식 컨텍스트의 데이터 정렬에 따라 동일한 단어 / 구문"이기 때문에 "같지 않음"이고 LEN은 "단어 / 구문의 문자 수"입니다. 데이터 정렬은 후행 공백을 선행하는 단어 / 구문의 일부로 처리하지 않습니다 (단, 선행 공백을 선행하는 문자열의 일부로 처리 함).
'this'와 'this'를 구분해야하는 경우 'this'와 'this'는 같은 단어이므로 "같은 단어 또는 구문입니다"연산자를 사용하지 마십시오.
= works 방식에 기여하는 것은 문자열 같음 연산자가 인수의 내용과 표현식의 데이터 정렬 컨텍스트에 의존해야한다는 생각이지만, 둘 다 문자열 유형 인 경우 인수의 유형에 의존해서는 안됩니다. .
"이것들은 같은 단어입니다"라는 자연어 개념은 일반적으로 =와 같은 수학적 연산자로 캡처 할 수있을만큼 정확하지 않으며 자연어에는 문자열 유형 개념이 없습니다. 문맥 (즉, 대조)은 중요하고 (자연어로 존재) 스토리의 일부이며, 추가 속성 (일부 기발 해 보이는)은 =의 부 자연스러운 세계에서 잘 정의되도록 정의의 일부입니다. 데이터.
유형 문제에서 단어가 다른 문자열 유형에 저장 될 때 변경되는 것을 원하지 않을 것입니다. 예를 들어, VARCHAR (10), CHAR (10) 및 CHAR (3) 유형은 모두 'cat'및?라는 단어의 표현을 보유 할 수 있습니다. = 'cat'은 이러한 유형의 값이 'cat'이라는 단어를 포함하는지 여부를 결정하도록해야합니다 (대소 문자 및 악센트 문제는 데이터 정렬에 의해 결정됨).
JohnFx의 의견에 대한 응답 :
보다 온라인 설명서에서 char 및 varchar 데이터 사용을 . 그 페이지에서 인용하면 다음과 같습니다.
각 char 및 varchar 데이터 값에는 데이터 정렬이 있습니다. 데이터 정렬은 각 문자를 나타내는 데 사용되는 비트 패턴과 같은 속성을 정의합니다.
비교 규칙 및 대소 문자 또는 악센트에 대한 민감도.
찾기가 더 쉬울 수 있다는 데 동의하지만 문서화되어 있습니다.
또한 주목할 가치가있는 것은 =가 실제 데이터와 관련이있는 SQL의 의미 체계와 비교 컨텍스트 (컴퓨터에 저장된 비트에 대한 내용과 반대)가 오랫동안 SQL의 일부 였다는 것입니다. RDBMS와 SQL의 전제는 실제 데이터를 충실하게 표현하는 것이므로 유사한 아이디어 (예 : CultureInfo)가 Algol과 유사한 언어 영역에 진입하기 수년 전에 데이터 정렬을 지원합니다. 이러한 언어의 전제는 비즈니스 데이터 관리가 아니라 엔지니어링 문제 해결이었습니다. (최근에는 검색과 같은 비 엔지니어링 애플리케이션에서 유사한 언어를 사용하는 것이 일부 확산되고 있지만 Java, C # 등은 여전히 비업무 적 뿌리에서 어려움을 겪고 있습니다.)
제 생각에는 SQL이 "대부분의 프로그래밍 언어"와 다르다고 비판하는 것은 공정하지 않습니다. SQL은 엔지니어링과는 매우 다른 비즈니스 데이터 모델링을위한 프레임 워크를 지원하도록 설계되었으므로 언어가 다르며 목표에 더 적합합니다.
SQL이 처음 지정되었을 때 일부 언어에는 기본 제공 문자열 유형이 없었습니다. 그리고 일부 언어에서는 여전히 문자열 사이의 같음 연산자가 문자 데이터를 전혀 비교하지 않고 참조를 비교합니다! 앞으로 10 ~ 20 년 후에 ==가 문화에 의존한다는 생각이 표준이된다면 놀라지 않을 것입니다.