답변:
차이점은 없습니다. 두건 아래 모두입니다 varlena
( 가변 길이 배열 ).
Depesz에서이 기사를 확인하십시오 : http://www.depesz.com/index.php/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text/
몇 가지 주요 사항 :
요약하면 다음과 같습니다.
- char (n) –보다 짧은 값을 처리 할 때 공간을 너무 많이 차지하고
n
( 값을 채움n
) 후행 공백을 추가하여 미묘한 오류가 발생할 수 있으며 한계를 변경하는 데 문제가 있습니다- varchar (n) – 실제 환경에서 제한을 변경하는 데 문제가 있습니다 (테이블을 변경하는 동안 독점 잠금이 필요함)
- varchar – 텍스트처럼
- text – 나에게는 승자 – 문제가 없기 때문에 n 개 이상의 데이터 유형, 그리고 varchar – 별개의 이름이 있기 때문에
이 기사에서는 4 가지 데이터 유형 모두에 대한 인서트 및 선택의 성능이 유사하다는 것을 보여주기 위해 자세한 테스트를 수행합니다. 또한 필요할 때 길이를 제한하는 다른 방법을 자세히 살펴 봅니다. 함수 기반 제약 조건 또는 도메인은 길이 제약 조건을 즉시 증가시킬 수있는 이점을 제공하며 문자열 길이 제약 조건을 줄이는 것이 드물다는 점을 고려할 때 depesz는 일반적으로 길이 제한에 대한 최선의 선택이라고 결론을 내립니다.
"와 같은 문자 유형 의 문서 점에서"밖으로 varchar(n)
, char(n)
그리고 text
모두 같은 방식으로 저장됩니다. 유일한 차이점은 길이가 주어진 경우 길이를 확인하기 위해 추가 사이클이 필요하고 패딩이 필요한 경우 추가 공간과 시간이 필요하다는 것입니다 char(n)
.
그러나 단일 문자 만 저장해야하는 경우 특수 유형을 사용하면 약간의 성능 이점이 있습니다 "char"
(큰 따옴표는 유형 이름의 일부 임). 필드에 더 빠르게 액세스 할 수 있으며 길이를 저장하는 오버 헤드가 없습니다.
방금 "char"
소문자 알파벳에서 선택한 1,000,000 개의 무작위 테이블을 만들었습니다 . 주파수 분포 ( select count(*), field ... group by field
) 를 얻는 쿼리 는 text
필드를 사용하는 동일한 데이터에서 약 760 밀리 초가 걸리는 데 약 650 밀리 초가 걸립니다 .
"char"
이 아닙니다 char
?? 현재 PostgreSQL 11+에서 유효합니까? ... 예 : "유형 "char"
(인용 부호 참고)은 1 바이트의 저장 공간 만 사용한다는 점에서 char (1)과 다릅니다. 시스템 카탈로그에서 단순한 열거 형 으로 내부적으로 사용됩니다 ." , guide / datatype-character .
"Pure SQL"벤치 마크 사용 (외부 스크립트없이)
UTF8과 함께 string_generator를 사용하십시오.
주요 벤치 마크 :
2.1. 끼워 넣다
2.2. 비교 및 계산 선택
CREATE FUNCTION string_generator(int DEFAULT 20,int DEFAULT 10) RETURNS text AS $f$
SELECT array_to_string( array_agg(
substring(md5(random()::text),1,$1)||chr( 9824 + (random()*10)::int )
), ' ' ) as s
FROM generate_series(1, $2) i(x);
$f$ LANGUAGE SQL IMMUTABLE;
특정 시험 준비 (예)
DROP TABLE IF EXISTS test;
-- CREATE TABLE test ( f varchar(500));
-- CREATE TABLE test ( f text);
CREATE TABLE test ( f text CHECK(char_length(f)<=500) );
기본 테스트를 수행하십시오.
INSERT INTO test
SELECT string_generator(20+(random()*(i%11))::int)
FROM generate_series(1, 99000) t(i);
그리고 다른 테스트들
CREATE INDEX q on test (f);
SELECT count(*) FROM (
SELECT substring(f,1,1) || f FROM test WHERE f<'a0' ORDER BY 1 LIMIT 80000
) t;
... 그리고 사용하십시오 EXPLAIN ANALYZE
.
다시 업데이트 2018 (pg10)
2018 년 결과를 추가하고 권장 사항을 강화하기 위해 약간의 편집.
평균적으로 많은 기계와 많은 테스트에서 내 결과는 모두 동일합니다
(통계적으로 적은 표준 편차).
사용 text
, 데이터 유형을
세 않도록 varchar(x)
때때로 표준, 예를 들어 있지 않기 때문에 CREATE FUNCTION
절 varchar(x)
≠varchar(y)
.
(같은과 한계를 표현 varchar
성능!)에 의해 CHECK
에 절 CREATE TABLE
예를 CHECK(char_length(x)<=10)
.
당신은 또한 할 수있는 제어 범위와 문자열 구조에 INSERT / UPDATE의 성능을 무시할 손실
예CHECK(char_length(x)>5 AND char_length(x)<=20 AND x LIKE 'Hello%')
"char"
그렇지 않습니다 char
. 는 AS 가이드 / 데이터 형 문자가 말한다 "유형 "char"
(인용 부호에주의)에만 저장 1 바이트를 사용하는의 문자 (1)과 다르다. 그것은 내부적으로 시스템 카탈로그에 사용되는 단순한 열거 형 ." .
PostgreSQL 매뉴얼
공백으로 채워진 유형을 사용할 때 스토리지 공간이 증가하고 길이가 제한된 컬럼에 저장할 때 길이를 확인하는 몇 가지 추가 CPU주기 외에는이 세 가지 유형간에 성능 차이가 없습니다. character (n)은 일부 다른 데이터베이스 시스템에서 성능 이점이 있지만 PostgreSQL에서는 그러한 이점이 없습니다. 실제로 character (n)은 추가 스토리지 비용으로 인해 일반적으로 3 개 중 가장 느립니다. 대부분의 상황에서 텍스트 나 문자를 다르게 사용해야합니다.
나는 보통 텍스트를 사용한다
참조 : http://www.postgresql.org/docs/current/static/datatype-character.html
제 생각 varchar(n)
에는 자체 장점이 있습니다. 예, 그들은 모두 동일한 기본 유형을 사용합니다. 그러나 PostgreSQL의 인덱스 는 행 당 2712 바이트 의 크기 제한이 있음을 지적해야합니다 .
TL; DR : 제약 조건없이text
유형
을 사용 하고 이러한 열에 색인이있는 경우 일부 열에 대해이 한계에 도달하고 데이터를 삽입하려고 할 때 오류가 발생하지만을 사용 하면이를 방지 할 수 있습니다.varchar(n)
자세한 내용 은 여기에서 문제는 PostgreSQL이 text
유형에 대한 인덱스를 만들 때 또는 2712보다 큰 varchar(n)
위치에 대한 예외를 제공하지 않는다는 n
것입니다. 그러나 압축 크기가 2712보다 큰 레코드를 삽입하려고하면 오류가 발생합니다. 이는 2712 이하로 압축되기 때문에 반복 문자로 쉽게 구성된 100.000 문자의 문자열을 삽입 할 수 있지만 압축 된 크기가 2712 바이트보다 커서 4000 문자로 일부 문자열을 삽입하지 못할 수 있습니다. 사용하는 varchar(n)
곳 n
없는 너무 많은 2,712 이상, 당신은 이러한 오류로부터 안전 해요.
text와 varchar는 암시 적 유형 변환이 다릅니다. 내가 주목 한 가장 큰 영향은 후행 공백을 처리하는 것입니다. 예를 들어 ...
select ' '::char = ' '::varchar, ' '::char = ' '::text, ' '::varchar = ' '::text
예상대로 반환 true, false, true
하지 않습니다 true, true, true
.
http://www.sqlines.com/postgresql/datatypes/text 에서 좋은 설명 :
TEXT와 VARCHAR (n)의 유일한 차이점은 VARCHAR 열의 최대 길이를 제한 할 수 있다는 것입니다. 예를 들어 VARCHAR (255)는 255자를 초과하는 문자열을 삽입 할 수 없습니다.
TEXT와 VARCHAR은 모두 1Gb의 상한을 가지며 PostgreSQL 설명서에 따라 성능 차이가 없습니다.
character varying(n)
, varchar(n)
-(모두 동일). 오류가 발생하지 않고 값이 n 자로 잘립니다.
character(n)
, char(n)
-(모두 동일). 고정 길이이며 길이가 끝날 때까지 공백으로 채 웁니다.
text
-무제한 길이.
예:
Table test:
a character(7)
b varchar(7)
insert "ok " to a
insert "ok " to b
결과를 얻습니다.
a | (a)char_length | b | (b)char_length
----------+----------------+-------+----------------
"ok "| 7 | "ok" | 2