끝에 공백이있는 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.