선택에서 여전히 추가 문자가 일치하는 고유 식별자


19

우리는 고유 식별자와 함께 SQL Server 2012를 사용하고 있으며 추가 문자를 추가하여 선택하면 36 문자가 아닌 UUID와 일치하는 결과를 반환합니다.

예를 들면 다음과 같습니다.

select * from some_table where uuid = '7DA26ECB-D599-4469-91D4-F9136EC0B4E8' 

uuid가있는 행을 반환합니다 7DA26ECB-D599-4469-91D4-F9136EC0B4E8.

그러나 당신이 실행하면 :

select * from some_table where uuid = '7DA26ECB-D599-4469-91D4-F9136EC0B4E8EXTRACHARS'

또한 uuid가있는 행을 반환합니다 7DA26ECB-D599-4469-91D4-F9136EC0B4E8.

SQL Server는 선택을 수행 할 때 36자를 초과하는 모든 문자를 무시하는 것 같습니다. 이것은 버그 / 기능 또는 구성 가능한 것입니까?

프론트 엔드에서 길이에 대한 유효성 검사가 있기 때문에 큰 문제는 아니지만 올바른 동작으로 보이지 않습니다.

답변:


10

값이 중괄호로 묶인 경우에도 암시 적 변환이 작동합니다 {...}.

쿼리에 값을 추가하면 마지막 값이 }잘못된 위치에 있기 때문에 원래 값이 너무 길면 암시 적 변환이 실패합니다 .

select * 
from some_table 
where uuid = '{'+'7DA26ECB-D599-4469-91D4-F9136EC0B4E8'+'}'

당신이 변환을 시도하면

SELECT CONVERT(UNIQUEIDENTIFIER, '{'+'7DA26ECB-D599-4469-91D4-F9136EC0B4E8EXTRACHARS'+'}');

당신은 얻을

Msg 8169, Level 16, State 2, Line 1
Conversion failed when converting from a character string to uniqueidentifier.

10

SQL Server는 선택을 수행 할 때 36자를 초과하는 모든 문자를 무시하는 것 같습니다. 이것은 버그 / 기능 또는 구성 가능한 것입니까?

이 동작은 다음 uniqueidentifier유형의 온라인 설명서 항목에 설명되어 있습니다 .

BOL 항목 추출

참조 된 예는 다음과 같습니다.

BOL 예

즉, 나는 암묵적인 변환을 피하는 것을 선호합니다. uniqueidentifier문자는 ODBC 이스케이프 구문을 사용하여 T-SQL에서 직접 입력 할 수 있습니다 :

DECLARE @T AS TABLE
(
    uuid uniqueidentifier UNIQUE NOT NULL
);

INSERT @T (uuid)
SELECT {guid '{7DA26ECB-D599-4469-91D4-F9136EC0B4E8}'};

SELECT t.uuid 
FROM @T AS t 
WHERE 
    t.uuid = {guid '{7DA26ECB-D599-4469-91D4-F9136EC0B4E8}'};

이것은 문자열 표현을 유형으로 상수 접을 때 SQL Server가 실행 계획에서 내부적으로 사용하는 것과 동일한 구문입니다 uniqueidentifier.

SELECT t.uuid 
FROM @T AS t 
WHERE 
    t.uuid = '7DA26ECB-D599-4469-91D4-F9136EC0B4E8';

UUID에 대한 인덱스 탐색

uniqueidentifiersSQL Server로 입력 하거나 전달할 수 있는지 여부 는 사용중인 라이브러리에 따라 다를 수 있지만 36 자 문자열은 사용 가능한 옵션 중 가장 바람직하지 않습니다. 변환을 수행해야하는 경우 명시 적으로 변환하고 문자열 대신 16 바이트 이진 값을 사용하십시오.


9

추가 문자는 암시 적 변환 중에 SQL Server에서 단순히 무시 (잘 자동으로 잘림)합니다. 예를 들면 다음과 같습니다.

SELECT CONVERT(UNIQUEIDENTIFIER, '7DA26ECB-D599-4469-91D4-F9136EC0B4E8EXTRACHARS');

결과:

------------------------------------
7DA26ECB-D599-4469-91D4-F9136EC0B4E8

이것은이 시나리오와 다릅니다.

DECLARE @x VARCHAR(1) = 'xyz';
SELECT @x;

결과:

----
x  

이를 구성 할 수는 없지만 변수를 변환하지 못하게하려면 CHAR(36)먼저 변수를 테이블에 채워 넣으면 잘림으로 인해 실패합니다.

DECLARE @x TABLE(y CHAR(36));
INSERT @x SELECT '7DA26ECB-D599-4469-91D4-F9136EC0B4E8EXTRACHARS';

결과:

Msg 8152, Level 16, State 14, Line 2
String or binary data would be truncated.
The statement has been terminated.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.