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