빈 문자열 : 왜 또는 언제 ''가 ''와 같은가?


17

이유를 설명 할 수있는 사람

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

수확량

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

이것의 재미있는 결과는

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

업데이트는 실제로 빈 문자열을 공백으로 대체하지만 where 절은 계속 유효하며 update 문을 반복해서 실행하면

(1 row(s) affected)

답변:


22

후행 공백 설명 :

SQL Server는 문자열을 공백과 비교하는 방법에 대한 ANSI / ISO SQL-92 사양 (섹션 8.2,, 일반 규칙 # 3)을 따릅니다. ANSI 표준에서는 비교에 사용 된 문자열에 대해 채우기를 수행하여 길이를 비교하기 전에 길이를 일치시켜야합니다. 패딩은 WHERE 및 HAVING 절 조건 자와 다른 Transact-SQL 문자열 비교의 의미에 직접 영향을줍니다. 예를 들어 Transact-SQL은 문자열 'abc'및 'abc'가 대부분의 비교 작업에서 동일하다고 간주합니다.

이 규칙에 대한 유일한 예외는 LIKE 술어입니다. LIKE 조건 자 식의 오른쪽에 후행 공백이있는 값이 있으면 SQL Server는 비교가 발생하기 전에 두 값을 같은 길이로 채우지 않습니다. LIKE 술어의 목적은 정의상 단순한 문자열 동등성 테스트가 아닌 패턴 검색을 용이하게하는 것이기 때문에 앞에서 언급 한 ANSI SQL-92 스펙의 섹션을 위반하지 않습니다.

위에서 언급 한 모든 사례의 잘 알려진 예는 다음과 같습니다.

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

다음은 후행 공백 및 LIKE 에 대한 자세한 내용 입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.