그citext모듈은 다음을 제공합니다.
대소문자를 구분하지 않는 문자열 유형,citext. 본질적으로 내부적으로 호출합니다.하위값을 비교할 때. 그렇지 않으면
거의 똑같게 행동합니다텍스트.
대소토토 핫 구분하지 않는 일치를 수행하는 표준 접근 방식포스트그레SQL다음을 사용했습니다하위비교 시 함수
예를 들어 값
SELECT * FROM 탭 WHERE lower(col) = LOWER(?);
이것은 합리적으로 잘 작동하지만 많은 문제가 있습니다. 단점:
그것은 당신의 SQL 문을 장황하게 만들고 당신은 항상
사용하는 것을 기억해야 합니다하위열과 쿼리 값 모두에 대해.
기능을 생성하지 않는 한 색인을 사용하지 않습니다.
색인을 사용하여하위.
열을 다음과 같이 선언하는 경우고유또는기본 키, 암시적으로 생성된 색인은 대소문자를 구분합니다. 따라서 대소문자를 구분하지 않는 검색에는 쓸모가 없습니다. 대소문자를 구분하지 않고 고유성을 적용합니다.
그citext데이터 유형을 사용하면 다음을 수행할 수 있습니다.
호출 제거하위SQL에서
쿼리하고 기본 키가 대소토토 핫 구분하지 않도록 허용합니다.citext다음과 같이 로케일을 인식합니다텍스트은 다음과 일치함을 의미합니다.
대문자와 소문자는 규칙에 따라 다릅니다.
데이터베이스의LC_CTYPE설정.
다시 말하지만, 이 동작은 다음을 사용하는 것과 동일합니다.하위쿼리에서. 하지만 다 끝났으니까
데이터 유형별로 투명하게 표시되므로 기억할 필요가 없습니다.
검색어에 특별한 내용을 입력하세요.
다음은 간단한 사용법 예입니다:
테이블 사용자 생성(
닉 CITEXT 기본 키,
TEXT NOT NULL을 전달합니다.
);
INSERT INTO users VALUES ( 'larry', md5(random()::text) );
INSERT INTO users VALUES ( 'Tom', md5(random()::text) );
INSERT INTO users VALUES ( 'Damian', md5(random()::text) );
INSERT INTO users VALUES ( 'NEAL', md5(random()::text) );
INSERT INTO users VALUES ( 'Bjørn', md5(random()::text) );
SELECT * FROM 사용자 WHERE nick = 'Larry';
그선택문이 반환됩니다 하나의 튜플, 비록닉열이 다음으로 설정되었습니다.래리그리고 쿼리 였습니다래리.
citext비교를 수행합니다.
각 문자열을 소문자로 변환합니다(마치하위호출됨) 이후
정상적으로 결과가 나옵니다. 따라서 예를 들어 두 개의 문자열이 고려됩니다.
같음하위생산할 것입니다
결과는 동일합니다.
대소토토 핫 구분하지 않는 대조를 최대한 가깝게 에뮬레이션하기 위해 가능한 한 있습니다citext특정 다양한 문자열 처리 연산자 버전 및 기능. 예를 들어 정규식 연산자는~그리고~*적용 시 동일한 동작을 나타냄citext: 둘 다 대소토토 핫 구분하지 않고 일치합니다. 는 마찬가지입니다!~그리고!~*뿐만 아니라좋아요연산자~~그리고~~*및!~~그리고!~~*. 맞추고 싶다면 대소문자를 구분하여 연산자의 인수를 다음으로 캐스팅할 수 있습니다.텍스트.
마찬가지로 다음 함수는 모두 일치를 수행합니다. 인수가 다음과 같은 경우 대소문자를 구분하지 않습니다.citext:
regexp_matches()
regexp_replace()
regexp_split_to_array()
regexp_split_to_table()
교체()
split_part()
strpos()
번역()
정규식 함수의 경우 일치하려는 경우 대소토토 핫 구분하여 지정할 수 있습니다."c"대소문자 구분 일치를 강제하는 플래그입니다. 그렇지 않으면 다음으로 전송해야 합니다.텍스트이전에 대소문자를 구분하려면 다음 기능 중 하나를 사용하세요. 행동.
citext의 케이스 접기 동작 에 따라 달라집니다.LC_CTYPE설정 당신의 데이터베이스. 따라서 값을 비교하는 방법은 다음과 같습니다. 데이터베이스가 생성될 때 결정됩니다. 실제로는 그렇지 않습니다 유니코드에서 정의한 용어에서는 대소문자를 구분하지 않습니다. 표준. 효과적으로 이것이 의미하는 바는 다음과 같습니다. 당신은 데이터 정렬에 만족합니다. 만족해야 합니다.citext의 비교. 하지만 만약 당신이 데이터베이스에 저장된 다양한 언어의 데이터, 사용자 한 언어의 쿼리 결과가 다음과 같지 않을 수 있습니다. 대조가 다른 언어에 대한 것인 경우 예상됩니다.
현재토토 핫9.1, 다음을 첨부할 수 있습니다.콜레이트지정 대상citext열 또는 데이터 값. 현재,citext연산자는 기본값이 아닌 것을 존중합니다콜레이트비교하는 동안 사양 대소 문자로 접힌 문자열이지만 초기에는 소문자로 접혀 있습니다. 항상 데이터베이스의 명령에 따라 수행됩니다.LC_CTYPE설정(즉, 마치콜레이트 "기본값"주어졌습니다). 이는 향후 릴리스에서 변경되어 두 단계가 모두 수행될 수 있습니다. 입력을 따르세요콜레이트사양.
citext다음만큼 효율적이지 않습니다.텍스트연산자가 기능하기 때문에
B-트리 비교 함수는 다음의 복사본을 만들어야 합니다.
데이터를 소문자로 변환하여 비교하세요. 그것은,
그러나 다음을 사용하는 것보다 약간 더 효율적입니다.하위대소토토 핫 구분하지 않으려면
일치합니다.
citext별로 도움이 되지 않습니다.
일부 상황에서는 대소토토 핫 구분하여 비교할 데이터가 필요합니다.
다른 상황에서는 대소토토 핫 구분하지 않습니다. 표준 답변
를 사용하는 것입니다.텍스트입력하고 수동으로
사용하다하위경우에 함수
대소문자를 구분하지 않고 비교해야 합니다. 이것은 모두 작동합니다
대소문자를 구분하지 않는 비교가 필요한 경우에만 적합합니다.
드물게. 대부분의 경우 대소 문자를 구분하지 않는 동작이 필요한 경우
시간과 대소문자를 자주 구분하지 않는 경우 저장을 고려하세요.
데이터는 다음과 같습니다citext그리고 명시적으로
열을 다음으로 캐스팅합니다.텍스트당신이
대소 토토 핫 구분하여 비교하고 싶습니다. 어느 상황에서든 당신은
두 가지 유형의 검색을 모두 수행하려면 두 개의 색인이 필요합니다.
빨리 가세요.
다음을 포함하는 스키마citext연산자는 현재에 있어야 합니다검색_경로(일반적으로공개); 그렇지 않은 경우 정상 대소토토 핫 구분함텍스트연산자는 대신 호출됩니다.