러시아 모스크바에 있는 회사에서 프로젝트를 진행하던 중, postgresql이 지원하지 않는 문제가 발생했습니다. 국가 알파벳. 가능한 해결 방법을 찾은 후 로케일 지원을 직접 개발하기로 결정했습니다. 나는 C 프로그래머가 아니다 하지만 제가 일할 때 이미 로캘 프로그래밍에 대한 경험이 있었습니다. Perl(디버깅)과 엿보기를 사용합니다. 며칠간의 발굴 끝에 를 통해포스트그레소스 트리 I src/backend/utils/adt/varlena.c에 아주 사소한 수정을 가했으며 src/backend/main/main.c 그리고 필요한 것을 얻었습니다! 나만 지원했는데 에 대한LC_CTYPE그리고LC_COLLATE, 하지만 나중에LC_MONETARY다른 사람들이 추가했습니다. 메시지를 많이 받았어요 이 패치에 대한 사람들의 의견이 많아서 개발자에게 보내기로 결정했습니다. 그리고 (놀랍게도) 그것은포스트그레스배포.참고:Oleg Bartunov 작성. 참조올렉의 웹페이지로케일 및 러시아어에 대한 추가 정보 언어 지원.
사람들은 종종 로케일이 자신에게 적합하지 않다고 불평합니다. 거기 몇 가지 일반적인 실수는 다음과 같습니다.
컴파일하기 전에 postgresql을 제대로 구성하지 않았습니다. 당신 로케일을 활성화하려면 --enable-locale 옵션과 함께 구성을 실행해야 합니다. 지원. 시작할 때 환경을 올바르게 설정하지 않았습니다. 우체국장. 환경 변수를 정의해야 합니다.LC_CTYPE그리고LC_COLLATE백엔드가 정보를 가져오기 때문에 postmaster를 실행하기 전에 환경의 로케일에 대해. 다음 쉘 스크립트를 사용합니다 (실행포스트그레스):
#!/bin/sh
LC_CTYPE=koi8-r 내보내기
LC_COLLATE=koi8-r 내보내기
postmaster -B 1024 -S -D/usr/local/pgsql/data/ -o '-Fe'그리고 rc.local에서 다음과 같이 실행하세요/bin/su - postgres -c "/home/postgres/runpostgres"
OS에서 깨진 로케일 지원(예: OS의 로케일 지원) Linux의 libc는 여러 번 변경되었으며 이로 인해 문제가 많다). 최신 Perl은 로케일도 지원합니다. 로케일이 깨졌습니다.펄 -v불평할 것이다 다음과 같은 것:
8:17[미라]:~/WWW/postgressetenv LC_CTYPE not_exist
8:18[미라]:~/WWW/postgresperl -v
perl: 경고: 로케일 설정에 실패했습니다.
perl: 경고: 로케일 설정을 확인하십시오:
LC_ALL = (설정되지 않음),
LC_CTYPE = "존재하지 않음",
LANG = (설정되지 않음)
지원되며 시스템에 설치됩니다.
perl: 경고: 표준 로케일("C")로 대체됩니다.
로케일 파일의 위치가 잘못되었습니다! 가능한 위치는 다음과 같습니다:/usr/lib/젠 토토(리눅스, 솔라리스),/usr/share/locale(리눅스),/usr/lib/nls/loc(DUX 4.0). 확인man 젠 토토올바른 위치를 찾으려면. 아래 Linux 사이에 심볼릭 링크를 만들었습니다./usr/lib/젠 토토그리고/usr/share/locale다음 libc가 내 로케일을 손상시키지 않습니다.
문자열에 ~* 및 order by 연산자를 사용할 수 있습니다. 국가 알파벳의 문자. 영어가 아닌 사용자는 확실히 그게 필요해. 젠 토토 항목을 사용하지 않으려면 정의를 취소하십시오. USE_LOCALE 변수입니다.
젠 토토 사용에는 한 가지 분명한 단점이 있습니다. 바로 속도입니다! 그래서, 꼭 필요한 경우에만 젠 토토을 사용하세요.