Articles

후행 공백에서는 SQL Server

이번 주 비디오는 유튜브에

오랜 시간 전에 내가 내장된 응용 프로그램을 캡처 한 사용자 입력이 있습니다. 응용 프로그램의 한 가지 기능은 사용자의 입력을 값 데이터베이스와 비교하는 것이 었습니다.

응용 프로그램을 수행 이 텍스트는 비교로는 부분의 SQL 서버에 저장 프로시저를 허용하기 쉽게 업데이트 비즈니스 로직 미래에 필요한 경우입니다.

어느 날,내가 이메일을 받은 사용자에게서 말하는 값은 그들이 입력되었와 일치하는 값 데이터베이스는 그들은 알고 없이 일치합니다., 후행 공백 문자를 처리 할 때 SQL Server 의 카운터 직관적 인 평등 비교를 발견 한 날입니다.

패딩 흰색 공간

당신은 아마 알고 있는 CHAR 데이터 입력 패드 값을 가진 공간까지 길이가 정의에 도달한다.

LEN()함수의 수를 표시 문자에서 우리의 문자열하는 동안,데이터 길이()함수는 우리를 보여줍니다 바이트 수를 사용하여하는 문자열입니다.

이 경우 DATALENGTH 는 10 과 같습니다., 이 결과는 정의 된 문자 길이 10 을 채우기 위해 문자”a”다음에 발생하는 패딩 된 공백 때문입니다. 값을 16 진수로 변환하여이를 확인할 수 있습니다. 값 61(16 진수의”a”)다음에 9 개의”20″값(공백)이 표시됩니다.

경우 우리는 변화의 변수 데이터를 입력하 VARCHAR,우리가 값을 보고 더 이상이 패딩과 함께 공간:

주어진 것 하나 이러한 데이터의 유형 패드 값을 공백 문자로하는 동안 다른 하지 않으면 어떻게 됩니까?우리는 비교 두?,

이 경우에는 SQL 서버려 두 값이 동일하더라도 우리는 것을 확인할 수 있습 DATALENGTHs 는 다릅니다.

이 동작은 혼합 데이터 유형 비교에서만 발생하는 것은 아닙니다. 하나의 값이 여러 공백 문자를 포함하는 동일한 데이터 유형의 두 값을 비교하면 우리는 무언가를 경험합니다…예상치 못한다.

더라도 우리는 두 변수의 값이 다(공백을 공백 문자),SQL Server 고려한 값이 동일하다.,

경우 우리는 캐릭터와 함께 일부 공백 우리는 볼 것과 동일한 동작:

두 값은 분명히 다르지만,SQL 서버의 고려 그들이 서로 동일하다. 스위칭 우리의 동일한 표시를 운영자와 같은 변경은 것을 약간:

더라도 나는 생각할 것 없이 어떤 와일드카드 문자처럼 행동이 동등한 기호,SQL 서버를 실행하지 않는 이러한 비교는 동일한 방법입니다.,

경우 우리가 스위치를 다시 우리의 동일한 로그인을 비교하고 접두어 우리의 문자값을 가진 공간을 우리는 또한 알 다른 결과:

SQL 서버려 두 값이 동등한 관계없이 공간에서 발생하는 문자열의 끝. 그러나 문자열 앞의 공백은 더 이상 일치하는 것으로 간주되지 않습니다.

무슨 일이야?

ANSI

카운터 직관적 인 반면 SQL Server 의 기능은 정당합니다., Sql Server 는 문자열을 비교하기 위해 ANSI 사양을 따르고 문자열에 공백을 추가하여 비교하기 전에 길이가 동일하도록합니다. 이것은 우리가보고있는 현상을 설명합니다. 그러나 LIKE 연산자로는이 작업을 수행하지 않으므로 동작의 차이를 설명합니다.

여분의 공백이 중요 할 때 비교

후행 공백의 차이가 중요한 곳에서 비교를하고 싶다고 가정 해 봅시다.

하나의 옵션은 우리가 다시 몇 가지 예를 보았 듯이 같은 연산자를 사용하는 것입니다., 그러나 이것은 LIKE 연산자의 일반적인 사용은 아니므로 쿼리가 그것을 사용하여 수행하려고 시도하는 것을 언급하고 설명해야합니다. 마지막 것은 당신이 원하는 것은 어떤 미래의 관리자에게 당신의 코드 스위치를 다시 그것을 등호기 때문에 그들은 보이지 않는 어떤 와일드카드 문자입니다.

는 또 다른 옵션을 본 적이 수행하는 데이터 길이의 비교 가치에 더하여 비교:

이 솔루션은 옳지 않는 모든 시나리오 그러나입니다., 우선,SQL Server 가 값 비교 또는 DATALENGTH 술어를 먼저 실행하는지 알 수있는 방법이 없습니다. 이로 인해 인덱스 사용에 혼란을 겪고 성능이 저하 될 수 있습니다.

데이터 유형이 다른 필드를 비교하는 경우 더 심각한 문제가 발생할 수 있습니다., 예를 들어,비교할 때 VARCHAR 을 이며 데이터 입력,그것은 아주 쉽게 만들기 시나리오는 비교를 사용하여 쿼리 데이터 길이 긍정:

여기에 이며 매장 2 바이트에 대한 모든 문자는 원인이 DATALENGTHs 하나의 캐릭터 이며 동일한 것을 캐릭터+공간 VARCHAR 값입니다.

이러한 시나리오에서해야 할 가장 좋은 일은 데이터를 이해하고 특정 상황에 맞는 솔루션을 선택하는 것입니다., 삽입하기 전에 데이터를 다듬을 수도 있습니다(그렇게하는 것이 합리적이라면)!