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