끝에 공백이있는 Varchar의 동작


14

공백이있는 Varchar를 사용하면 끝에 공백이 무시됩니다.

전의:

declare @X varchar(50)

이...

set  @X= 'John'

...와 같다...

set @X= 'John           '

이것들은 같다고 생각합니다. 시스템이이를 다르게 인식하도록하려면 어떻게해야합니까?

답변:


23

모든 것은 ANSI 표준을 따릅니다.

후행 공백 설명 :

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 에 대한 자세한 내용 입니다.

하지만 당신이 그들을 다른하려면 - 당신이 사용하기로 결정 있습니다 DATALENGTH대신 기능을 LEN하기 때문에,

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

대신에 1을 넣을 것입니다

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

해결책

  • DATALENGTH 함수를 사용하여 문자열을 다르게하는 방법
  • 문자열을 NVARCHAR 유형으로 캐스팅하려면-이 유형을 SP의 매개 변수에 선언하는 것이 좋습니다.

화려한 포스트, 마침내 좋은 정보를 발견
Gaspa79

-2

조건에 공백을 추가하기 만하면됩니다.

set @X= 'John           \n'

문자열 함수의 후행 공백


5
\nSQL Server에는 의미가 없습니다. 새 줄로 해석되지 않습니다. 이것은 어쨌든 묻는 질문에 대한 답변이 아닙니다.
Martin Smith

@MartinSmith이지만 MSDN으로 작성되었습니다. "문자열에 후행 공백이 있어야하는 경우 마지막에 공백 문자를 추가하여 SQL Server가 문자열을 자르지 않도록 고려해야합니다."
Yiping
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.