2011-02-10 6 views
2

da_DK.utf8 로켈로 작성된 PostgreSQL 8.4 데이터베이스가 있습니다.PostgreSQL은 주문시 대시를 무시합니다.

dbname=> show lc_collate; 
lc_collate 
------------ 
da_DK.utf8 
(1 row) 

문자를 변경하는 열에서 주문하는 테이블에서 무언가를 선택하면 IMO가 이상하게 작동합니다. 결과를 주문할 경우 PostgreSQL을이 값을 접두사 대시를 무시, 예컨대 :

select name from mytable order by name asc; 

는 대시 접두사가 무시 될 것으로 보인다

name 
---------------- 
Ad... 
Ae... 
Ag... 
- Ak.... 
At.... 

처럼 뭔가를 반환 할 수 있습니다. 주문시

나는 latin1에하는 열을 변환하여이 문제를 해결할 수 있습니다 :

select name from mytable order by convert_to(name, 'latin1') asc; 

을 내가 같은 예상 결과를 얻을 :

name 
---------------- 
- Ak.... 
Ad... 
Ae... 
Ag... 
At.... 

왜 대시 접두사은 기본적으로 무시됩니까을? 그 행동을 바꿀 수 있습니까?

+0

사용하고있는 OS 그 중 하나 ... 좋아하지 않아 그래서 그것은 확실히 성능에 영향을 미칠 것인가? Windows 7에서는 잘 작동하지만 convert_to()는 필요하지 않습니다. –

+0

나는 우분투 서버 10.10을 사용하고 있고 PostgreSQL은 정확하게 버전 8.4.7을 사용하고있다. – HakonB

답변

1

내 구체적인 경우에 효과가있는 임시 해결책은 느낌표로 대시를 대체하는 것입니다. 나는 느낌표를 결코 얻지 않을 것이고 어떤 글자 나 숫자 앞에 정렬 될 것임을 알게된다.

select name from mytable order by translate(name, '-', '!') asc 

I 정렬에 특별한 열을 만들기로 보일 수 있지만, 정말

3

로캘 da_DK.utf8로 정의되어 있기 때문입니다. Linux 로케일 인식 유틸리티 (예 : sort)도 이와 같이 작동합니다.

convert_to(name, 'latin1')은 라틴어 1 문자 집합이 아닌 문자 (예 : )를 찾으면 중단되므로 좋은 해결책이 아닙니다.

로케일 정의 정렬을 무시하고 단순히 바이트 값을 사용하는 order by convert_to(name, 'SQL_ASCII')을 사용할 수 있습니다.


미운 해킹 편집 :

order by 
    (
    ascii(name) between ascii('a') and ascii('z') 
    or ascii(name) between ascii('A') and ascii('Z') 
    or ascii(name)>127 
), 
    name; 

이 ASCII가 아닌 문자로 시작 첫번째 아무것도 정렬합니다. 문자열에서 더 정렬하는 것이 이상하게 작동 할 것이므로 매우 추악합니다. 그러나 그것은 당신에게 충분할 수 있습니다.

+0

latin1로 변환하면 무언가가 깨질 것이라는 것을 알았지 만 실제로는 이중 - a ('aa')와 같은 정확한 덴마크 정렬 순서가 필요하다. 'z'다음에 마지막으로 정렬됩니다. – HakonB

+0

아마도이 제안 된 해킹으로 충분할 것입니다. – Tometzky

+0

나는 번역 (name, '-', '!') 솔루션을 기억하기가 복잡하지 않고 내 문제를 해결할 때 더 좋아진다. – HakonB

0

나는 어떻게 네덜란드어에 대한 규칙을 주문하는 것처럼 보일지 모르지만 공백, 대시 등과 같은 폴란드 특수 문자는 대부분의 사전에서 정렬에 "계산되지"않습니다. 일부 좋은 정렬 루틴은 동일한 작업을 수행하고 이러한 특수 문자를 무시합니다. 아마도 네덜란드어에서는 유사한 규칙이 있으며이 규칙은 Ubuntu 로켈 인식 정렬 함수로 구현됩니다.

관련 문제