문제

이 쿼리 :

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' (예 : 유니 코드 유형 사용). 이것이 또한 마지막 사건이 어떤 행을 반환하지 않는지 분명하게하기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top