SQL Server 2005 문자열 비교에서 문제를 일으키는 유니 코드 문자
-
21-09-2019 - |
문제
이 쿼리 :
select *
from op.tag
where tag = 'fussball'
태그 열 값이 "fußball"인 결과를 반환합니다. "태그"열은 Nvarchar (150)로 정의됩니다.
나는 그들이 이해하는 동안 문법적으로 비슷한 단어, 누구 든지이 행동을 설명하고 방어 할 수 있습니까? 열/테이블에서 케이스 감도를 변경할 수있는 동일한 콜레이션 설정과 관련이 있다고 생각하지만 누가이 동작을 원합니까? 열의 고유 한 제약 조건은 또한 제약 조건 위반으로 인해 다른 값이 존재할 때 한 값의 삽입에 실패를 유발합니다. 이것을 끄는 방법은 무엇입니까?
후속 보너스 포인트 질문. 이 쿼리가 왜 행을 반환하지 않는지 설명하십시오.
select 1
where 'fußball' = 'fussball'
보너스 질문 (답변?) : @Scottcher는 개인적으로 나에게 바르 르 차로 취급되는 문자열 "Fussball"때문이라고 지적했다. 이 쿼리는 결과를 반환합니다.
select 1
where 'fußball' = cast('fussball' as nvarchar)
그러나 다시, 이것은 다음과 같습니다.
select 1
where cast('fußball' as varchar) = cast('fussball' as varchar)
나는 혼란 스럽다.
해결책
연결/테이블/데이터베이스에 대한 유니 코드 콜레이션 세트는 SS == ß를 지정합니다. 후자의 동작은 빠른 경로에 결함이 있거나 이진 비교를 수행하거나 오른쪽 인코딩의 ß를 지나치지 않을 수도 있기 때문입니다 (바보 같은 동의).
http://unicode.org/reports/tr10/#searching U+00DF는 특수 적용이라고 언급합니다. 통찰력있는 발췌문이 있습니다.
언어에 민감한 검색 및 매칭은 Collation과 밀접한 관련이 있습니다. 일부 강도 수준에서 동일하게 비교하는 문자열은 언어에 민감한 일치 할 때 일치 해야하는 문자열입니다. 예를 들어, 주요 강도에서 "ß"는 UCA에 따르면 "SS"와 일치하고 UCA의 덴마크 맞춤에서 "aa"는 "Å"과 일치합니다.
다른 팁
선택 하다 collation latin1_general_ci_as (sql2000)로 행을 반환하십시오.
그렇습니다 ~ 아니다 collation latin1_general_bin과 함께.
n/varchar 이후 Collate <Collation> 키워드를 사용하여 테이블 열 A 콜레이션을 할당 할 수 있습니다.
구문을 사용하여 문자열과 특정 콜레이션을 비교할 수도 있습니다.
string1 = string2 COLLATE < collation >
일부 도우미 답변 - 질문에 대한 완전한 것이 아니라 여전히 도움이 될 수 있습니다.
시도하면 :
SELECT 1 WHERE N'fußball' = N'fussball'
"1" - "N"을 사용하여 유니 코드를 의미 할 때 두 문자열은 동일하게 간주됩니다. 왜 그런지, 아직 모릅니다 (아직).
찾기 위해 기본 콜레이션 서버의 경우 사용합니다
SELECT SERVERPROPERTY('Collation')
찾기 위해 주어진 열의 협업 데이터베이스 에서이 쿼리를 사용하십시오.
SELECT
name 'Column Name',
OBJECT_NAME(object_id) 'Table Name',
collation_name
FROM sys.columns
WHERE object_ID = object_ID('your-table-name')
AND name = 'your-column-name'
이것은 행동을 설명하는 대답은 아니지만 관련이있을 수 있습니다.
~ 안에 이것 질문, 나는의 공동화를 사용했다는 것을 배웠다
Latin1_General_Bin
대부분의 콜레이션 기발함을 피할 것입니다.
보너스 질문 (답변?) : @Scottcher는 개인적으로 나에게 바르 르 차로 취급되는 문자열 "Fussball"때문이라고 지적했다. 이 쿼리는 결과를 반환합니다.
select 1 where 'fußball' =
cast('fussball' as nvarchar)
여기에서 언급 된대로 SQL Server 데이터 유형 우선 순위 규칙을 다루고 있습니다. 데이터 유형 우선 순위. 비교는 항상 더 높은 우선 순위 유형을 사용하여 수행됩니다.
연산자가 서로 다른 데이터 유형의 두 가지 표현을 결합한 경우, 데이터 유형 우선 순위에 대한 규칙은 우선 순위가 낮은 데이터 유형이 더 높은 우선 순위로 데이터 유형으로 변환되도록 지정합니다.
Nvarchar는 Varchar보다 우선 순위가 높기 때문에 예제의 비교는 Nvarchar 유형을 고소하면서 비교할 것이므로 실제로는 정확히 동일합니다. select 1 where N'fußball' =N'fussball'
(예 : 유니 코드 유형 사용). 이것이 또한 마지막 사건이 어떤 행을 반환하지 않는지 분명하게하기를 바랍니다.