postgres 9.1 및 8.4의 간단한 비교 테스트에서 다음과 같은 이상한 결과가 나타납니다.'A'< 'a'에 대한 postgresql 디버깅
postgres=# select 1 one where 'A' < 'a';
one
-----
(0 rows) // ..... I would have expected 1 row
postgres=# select 1 one where 'A' < 'b';
one
-----
1
(1 row) // ...... this looks OK
postgres=# select 1 one where 'A' = 'a';
one
-----
(0 rows) // ...... This also looks OK
postgres=# select 1 one where 'A' > 'a';
one
-----
1
(1 row) // ...... This is inconsistent with the above results
'A'의 ASCII 값 0x41을이고 A는이 0x61 너무 ASCII 값의 직선 비교 'A'가 'A'보다 작은 경우, 또는 다음 몇몇 경우 경우 insentive 마법에 있다는 것을 의미한다 있습니다 최소한 A> b 및 Alocale 문제이지만, 다시 한번 - 내 로컬은 같은 결과를 갖는 표준 Centos5 및 Fedora16 설치를 사용하여 표준 us_EN.utf8 설정으로 설정됩니다.
postgres 프로세스에 디버거를 연결하면 문제가 발생했다는 것을 알 수있었습니다.
strcoll("A","b") returns -1;
가 그러나 이것은 단지 POSTGRES 프로세스 내에서 입증 할 수
strcoll("A","a") returns 6;
하나 아래에 완벽하게 합리적인 결과를 제공 같은 외부 프로그램 (예 GDB를 부착하는 경우 등). 아무도 strcoll 나쁜 값을 반환하는 원인이 무엇인지에 관해서는 어떤 생각을 가지고 않으며, 그것을 해결하는 방법 같은 제안은 나의 샘플 SQL이 제대로 작동합니다
main()
{
char *a="a";
char *b="b";
char *A="A";
printf("%s\n",setlocale(2,"us_ENG.utf8"));
printf("%d\n",strcoll(A,a));
printf("%d\n",strcoll(A,b));
printf("%d\n",strcoll(a,a));
printf("%d\n",strcoll(b,b));
printf("%d\n",strcoll(a,A));
printf("%d\n",strcoll(b,A));
printf("%d\n",strcoll(b,a));
printf("%d\n",strcoll(A,A));
}
질문입니다.
업데이트 : 나는 initdb --locale=C
로 데이터베이스를 다시 시도하고, 'A'< 'A'가 예상 결과를 얻을 수 -이 UTF-8로 작성된 데이터베이스에 실패하는 이유를 설명하지 그러나.
UTF-8은 * 인코딩 *이며 * 데이터 정렬에 대해서는 거의 언급하지 않았습니다. –
팁 : 예제 프로그램이 잘못되었습니다 :'setlocale (LC_COLLATE, "en_US.UTF-8"));을 사용하면 PostgreSQL과 같은 결과를 반환합니다. 메모 _both_ 변경된 로케일 (귀하의 의견에서 가져온 것) _ 및 _ 'LC_COLLATE'것. –
감사합니다. @ A.H - 절대적으로 맞습니다. – Soren