2011-10-15 1 views

답변

5

C 로켈이 수행합니다. UTF-8은 바이트 순서가 코드 포인트 정렬이기도하도록 설계되었습니다. 이것은 사소한 것이 아니라 UTF-8의 작동 방식을 고려해야합니다

 
Number range Byte 1 Byte 2 Byte 3 
0000-007F  0xxxxxxx 
0080-07FF  110xxxxx 10xxxxxx 
0800-FFFF  1110xxxx 10xxxxxx 10xxxxxx 

일명 C 로케일 이진 데이터 정렬, 최초의 비 동일 바이트 orering을 etermine 것입니다. UTF-8로 인코딩 된 두 개의 숫자가 다른 경우 첫 번째 비 동일 바이트가 더 낮은 값에 대해 더 낮을 것입니다. 숫자가 다른 범위에 있으면 첫 번째 바이트는 실제로 더 낮은 숫자에 대해 더 낮습니다. 동일한 범위 내에서, 순서는 문자 그대로 부호화하지 않는 것과 동일한 비트로 결정됩니다.

+0

그것은 코드 포인트 정렬이며 유니 코드에서는 쓸모가 없습니다. Unicode Collation Algorithm에서 Unicode에 필요한 정렬 알고리즘을 사용하여 어떻게 알맞은 알파벳 정렬을 수행합니까? – tchrist

+2

@tchrist : 그건 질문이 아닙니다. –

1

Postgres는 클러스터 생성시 시스템 로캘에 정의 된 데이터 정렬을 사용합니다.

당신은 인코딩에 의해 (열, '진수') 텍스트의

5

정렬 순서 lc_collate에 따라 주문하는 것을 시도 수 (하지 시스템 로케일을!). 시스템 로켈은 다른 로켈을 제공하지 않을 경우 db 클러스터를 만들 때 기본값으로 만 사용됩니다.

예상되는 동작은 로캘 C에서만 작동합니다. 모든 in the fine manual 그것에 대해 읽기 :

C 및 POSIX 정렬을 모두에만 ASCII 문자 "A" "Z"를 통해 에서 "전통적인 C"동작을 지정하는 문자, 및 정렬이 완료로 간주됩니다 엄격하게 문자 코드 바이트 값.

강조 광산. PostgreSQL 9.1에는 두 개의 new features for collation가 있습니다. 정확히 당신이 찾고있는 것일 수 있습니다.

+0

어떻게 코드 포인트 정렬 대신 알파벳 정렬을 수행합니까? 알다시피, 그것은 Unicode Collation Algorithm을 사용합니다. 그렇지 않으면 유니 코드 텍스트에서 알파벳순 정렬을 얻지 못합니다. – tchrist

+0

@tchrist : 일반적으로 로케일로'lc_collate'가 설정되어 있습니다. 예 : 영국에서는'lc_collate'를'en_EN.utf8'로 설정했을 것입니다. 당신의 설정을 보려면'show lc_collate;'를 시도하십시오. 자세한 내용은 내 대답의 링크를 따르십시오. –