2016-08-22 4 views
2

그래서 두 개의 값을 비교할 때 최근에 wierd 버그가 발생했습니다.T-SQL ORDER BY는 " '-'+ ..."을 (를) 무시하지만 "+"+ ...를 사용하지 않습니다. "

내 값은 -1에서 2까지의 범위입니다. 때로는 -1이 0보다 크고 해결책은 간단하다고 생각하는 경우가 있습니다. 분명히 int 대신 varchar (50)로 설정된 열이 있습니다.

그러나 이것이 내가 왜 이런 일이 일어 났는지 생각하게했습니다. 왜냐하면 열이 varchar (50)로 설정 되었더라도 '-'는 '0'보다 낮은 char 값을 가져야합니다 ('-'의 charvalue는 45이고 '0'의 charvalue는 48이어야합니다).

몇 가지 테스트를 통해 알 수 있듯이 '-'는 ORDER BY가 신경 쓰지 않는 유일한 문자입니다.

예 :

SELECT 
    A.x 
FROM 
    (
     VALUES 
      ('-5'), ('-4'), ('-3'), ('-2'), ('-1'), 
      ('0'), ('1'), ('2'), ('3'), ('4'), ('5') 
    ) A(x) 
ORDER BY 
    A.x; 

SELECT 
    B.x 
FROM 
    (
     VALUES 
      ('+5'), ('+4'), ('+3'), ('+2'), ('+1'), 
      ('0'), ('1'), ('2'), ('3'), ('4'), ('5') 
    ) B(x) 
ORDER BY 
    B.x 

결과 :

Result of A 
0 
1 
-1 
2 
-2 
3 
-3 
4 
-4 
5 
-5 

Result of B 
+1 
+2 
+3 
+4 
+5 
0 
1 
2 
3 
4 
5 

의해 '+'순서 (+ 43 charvalue 있음) 오른쪽 느낌하지만은 '-'보인다 .. 잘못된 것
왜 이런 식으로 아는 사람이 있습니까?

추가 정보를 원하시면

Server 버전 : 12.0.4213
정렬 : Finnish_Swedish_CI_AS

결과를 왜곡 할 수 밖에 무슨 단서

. 더 많은 정보가 필요한지 물어보십시오.

+0

용서 나의 무지하지만, 기능'(x)는'A (X)'와'B는 무엇인가? –

+0

정상/예상 결과가 나타납니다. – Paparazzi

+0

A와 B는 생성 된 테이블의 이름이고 x는 생성 된 테이블의 단일 열 이름입니다. 내가 더 분명하게 만들 수 있었어, 미안 : P –

답변

1

발견 이유.

TLDR : 비 유니 코드 및 유니 코드 데이터 정렬은 '-'다르게 정렬합니다. 비 유니 코드 데이터를 정렬

"A SQL 데이터 정렬의 규칙이 마이크로 소프트 윈도우 운영 체제에서 제공하는 정렬 루틴과 호환되지 않는하지만, 유니 코드 데이터의 정렬은 특정 버전과 호환 유니 코드가 아닌 데이터와 유니 코드 데이터에 대한 비교 규칙이 다르므로 SQL 데이터 정렬을 사용하면 기본 데이터 유형에 따라 같은 문자의 비교에 대해 다른 결과가 표시 될 수 있습니다. 예를 들어 , SQL 데이터 정렬 "SQL_Latin1_General_CP1_CI_AS"를 사용하는 경우, 하이픈 ("-")이 "b"앞에 오는 별도의 문자로 정렬되기 때문에 유니 코드 문자열 'a-c'는 문자열 'ab'보다 이 적습니다. 그러나 이러한 문자열을 유니 코드로 변환하고 동일한 비교를 수행하면 유니 코드 N'ab-C '는 유니 코드 정렬 규칙에서 "단어 정렬"을 사용하기 때문에 N'ab'보다 큰 것으로 간주됩니다 .

소스 "하이픈을 무시 : https://support.microsoft.com/en-us/kb/322112

관련 문제