2013-10-30 3 views
2

파이프 문자가 포함 된 문자 열로 정렬 할 때는 SQL 서버가 특별한 작업을 수행해야합니다.파이프 문자로 SQL 서버 정렬 순서

아스키 ('0')가 반환하여 48

주문을 반환

아스키 ('|가 |') 유니 코드 ('')처럼 124을 반환 '|' 문자와 숫자 앞에있는 문자.

저는 데이터 정렬을 보려고했는데, 보았을 때 '|' 문자는 항상 내 테스트

select * from (
    select '0' as col1, ASCII('0') as col2, unicode('0') as col3 
    union select '1' as col1, ASCII('1') as col2, unicode('1') as col3 
    union select '|' as col1, ASCII('|') as col2, unicode('|') as col3 
    union select 'a' as col1, ASCII('a') as col2, unicode('a') as col3 
    union select ' ' as col1, ASCII(' ') as col2, unicode(' ') as col3 
    union select '.' as col1, ASCII('.') as col2, unicode('.') as col3 
    union select '/' as col1, ASCII('/') as col2, unicode('/') as col3 

) as q 
order by col1 

이 쿼리의 반환을 선택 여기에 값을 124

있습니다

col1 col2 col3 
1   32 32 
2  . 46 46 
3 / 47 47 
4  | 124 124 
5  0 48 48 
6  1 49 49 
7  a 97 97 

이유는 무엇입니까 47과 48 사이 (124) 가을?

사용되는 데이터 정렬은 SQL_Latin1_General_CP1_CI_AI입니다.

이진 배열 만 정렬을 위해 문자의 ascii/unicode 값을 사용하는 경우이 정렬에서 문자의 정렬 순서를 어떻게 찾을 수 있습니까?

+0

문자 코드를 사용하여 정렬하는 것은 이진 데이터 정렬 일뿐입니다. 'SELECT ASCII ('A'), ASCII ('a')'는'65,97'을 반환하지만 대부분의 데이터 정렬에서는 서로 정렬됩니다. –

+0

내 인스턴스가 SQL_Latin1_General_CP1_CI_AI를 사용하고 있으므로 'A'와 'a'가 서로 나란히 정렬됩니다. 해당 데이터 정렬에 대한 정렬 순서를 찾는 방법을 알고 있습니까? – GregA100k

+0

그렇게 간단하지 않습니다. 'SELECT CHAR (number) FROM master..spt_values ​​where type = 'P'그리고 0에서 255 사이의 ORDER BY CHAR (number) 사이의 숫자는 약간의 아이디어를 제공합니다. 그러나 'SELECT', 'AS X UNION SELECT', 'AE'UNION SELECT 'AF'ORDER BY X'의 정렬 순서를 보면 이것은 단일 문자 정렬 순서가 아닙니다. –

답변

3

다른 조합은 문자의 비교 순서를 변경합니다. 그들은 이 아니며은 ASCII 코드 또는 모든 문자의 유니 코드 값을 변경합니다. 즉, 데이터 정렬은 ASCII 코드 또는 유니 코드 값으로 정렬하는 것만 큼 거의 없습니다.

+0

특정 데이터 정렬에있는 문자의 값을 구별하는 방법을 알고 있습니까? – GregA100k

+0

@G_A -'아스키 선택 (CAST (N'ф '콜레이트 Bosnian_Cyrillic_100_CS_AS AS CHAR (1)))'? 또는 다른 것? –

+0

@MartinSmith 만약 그 값이 비교에 사용할 주문에 의해 결정되면 yes입니다. SELECT ASCII (CAST (N '|'COLLATE SQL_Latin1_General_CP1_CI_AI AS CHAR (1)) 은 ascii ('|') 및 unicode ('|') 함수와 마찬가지로 124를 반환합니다. – GregA100k

0

언급 된 의견과 답변 중 일부는 주문에 따라 순서가 결정됩니다. 유니 코드 차트에서 문자의 위치는 순서를 결정합니다. 데이터 정렬 시퀀스로 구성된 멀티 레벨 비교 알고리즘을 기반으로 Unicode Collation Algorithm에서

: 동일한 레벨이 두 개의 문자열이 동일 할 때 관계를 중단하는 방법에 대한 몇 가지 규칙입니다

Base Characters 
Accents 
Case Variants 
Punctuation 
Identical Level 

.

어떻게 작동하는지에 대한 규칙 이외에도 해당 정렬이 주어진 데이터 정렬에서 어떤 것인지를 찾고 싶었습니다. 주어진 정렬에 대해 문자의 순서가 무엇인지에 대한 문서를 찾을 수 없었지만 쿼리를 사용하여 표시 할 수 있습니다.

SELECT CHAR(number) 
FROM master..spt_values 
WHERE type='P' AND number BETWEEN 0 AND 255 
ORDER BY CHAR(number) COLLATE SQL_Latin1_General_CP1_CI_AI