2013-05-09 2 views
3

, 나는 C 로케일 (내 경우에는은 en_US.UTF-8),text_pattern_ops 비교자가 UTF-8을 인식합니까? PostgreSQL의 9.2 문서에 따르면

SELECT * from my_table WHERE text_col LIKE 'abcd%' 

필요 같은 지원 쿼리에 대한 텍스트 컬럼에 BTREE 인덱스 이외의 로켈을 사용하고 있다면 것은 할 수 그래서

CREATE INDEX my_idx ON my_table (text_col text_pattern_ops) 

이제 절처럼이 비교 "문자로 문자"는 결과 것을 11.9 of the documentation 상태를 text_pattern_ops를 사용하여 만들었습니다. 이러한 (비 와이드) C 문자가 있거나 비교가 UTF-8을 이해합니까?

답변

1

좋은 질문, 나는 완전히 확실하지 않다하지만 내 임시 이해는 다음과 같습니다 여기

PostgreSQL을이 "진짜 문자"(결국 멀티 바이트)을 의미하지 바이트. 비교는 "UTF-8을 이해합니다."항상이 특별한 색인이 있거나없는 상태입니다.

특별한 (비 C) 데이터 정렬 규칙이있는 로캘의 경우 비교 (<, > ...) 및 정렬을 수행 할 때 일반적으로 이러한 규칙을 따르고 (해당 로캘 라이브러리를 호출하기를 원합니다) 그러나 POSIX 정규 일치 및 LIKE 패턴에 이러한 조합을 사용하지 않으려합니다. 따라서 텍스트에 대한 두 가지 유형의 인덱스가 존재합니다.

+0

제 질문을 개선하고 로케일에 대해 설명해 주셔서 감사합니다. – user2366646

1

연산자 클래스 text_pattern_ops의 연산자는 실제로 문자열에 대해 memcmp()을 수행하므로 설명서에 문자에 대해 약간의 부정확성이있을 수 있습니다.

하지만 UTF-8을 지원하는지 여부는 실제로 영향을주지 않습니다. 설명 된 방식으로 패턴 일치 작업을 인덱싱하면 UTF-8을 지원합니다. 기본 연산자는 인코딩에 대해 걱정할 필요가 없습니다.

관련 문제