텍스트데이터 유형과
문자 가변(
바카르`) 데이터 유형의 차이점은 무엇인가요?
문서]1에 따르면 다음과 같습니다.
길이 지정자 없이 문자 가변을 사용하는 경우 이 유형은 모든 크기의 문자열을 허용합니다. 후자는 PostgreSQL 확장입니다.
및
또한 PostgreSQL은 모든 길이의 문자열을 저장하는 텍스트 유형을 제공합니다. 텍스트 유형은 SQL 표준에 없지만 다른 여러 SQL 데이터베이스 관리 시스템에도 텍스트 유형이 있습니다.
그렇다면 차이점은 무엇일까요?
내부적으로는 모두 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 - 텍스트와 마찬가지로 텍스트 - 문제가 없기 때문에 (n) 데이터 유형보다, varchar - 고유 한 이름이 있기 때문에 승자입니다.
이 문서에서는 4가지 데이터 유형 모두에 대한 삽입 및 선택의 성능이 유사하다는 것을 보여주기 위해 자세한 테스트를 수행합니다. 또한 필요한 경우 길이를 제한하는 다른 방법도 자세히 살펴봅니다. 함수 기반 제약 조건 또는 도메인은 길이 제약 조건을 즉시 증가시킬 수 있는 이점을 제공하며, 문자열 길이 제약 조건을 줄이는 경우는 드물다는 점을 근거로 Depesz는 일반적으로 이 중 하나가 길이 제한에 가장 적합한 선택이라고 결론을 내립니다.
문서에서 [문자 유형][1]
에 명시된 것처럼 varchar(n)
, char(n)
, text
는 모두 같은 방식으로 저장됩니다. 유일한 차이점은 길이가 주어진 경우 길이를 확인하는 데 추가 사이클이 필요하고, char(n)
에 패딩이 필요한 경우 추가 공간과 시간이 필요하다는 것입니다.
그러나 단일 문자만 저장해야 하는 경우 특수 유형 "char"
를 사용하면 약간의 성능상의 이점이 있습니다(큰따옴표는 유형 이름의 일부이므로 그대로 유지). 필드에 더 빠르게 액세스할 수 있고 길이를 저장하는 데 드는 오버헤드가 없습니다.
방금 소문자 알파벳에서 선택된 1,000,000개의 임의의 문자
로 구성된 테이블을 만들었습니다. 빈도 분포를 구하는 쿼리(선택 카운트(*), 필드 ... 필드별로 그룹화
)는 약 650밀리초가 걸리는 반면, 텍스트
필드를 사용하는 동일한 데이터에서는 약 760초가 걸립니다.
2016년 (pg9.5+) # # 업데이팅이 평가
및 사용 " 순결케 SQL"; 벤치마크 (없이 개외부 스크립트입니다)
2 주 벤치마크:
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;
. 이해 및 활용 '분석'.
2018년 & # 39 의 결과와 강화하십시오 권장안을 리틀이에요 편집할지 추가할 수 있습니다.
이후 내 결과, 평균, 대부분의 시스템 및 많은 테스트: , 모든 same*&l br/>. (통계적으로 덜 탐 표준 편차).
텍스트, 데이터 형식, < br/> 사용하여 '구형' varchar (x) ',' 피할 수 있는 경우가 있으므로 사용하지 않는 것이 varchar (x) '' 절 '작성 기능을 표준, 예를 들어' 'varchar (y)'.
익스플레스 제한값 (varchar 같은 '' 성능!) '확인', '테이블 만들기' 를 사용하여 절에 < br/>. (예: '검사 (char_length <, (x) = 10)'. 삽입 / 업데이트, br> <, 미미한 성능 저하를 제어할 수 있는 범위 및 구조, br/> < 문자열이어야 수도 있습니다. (예: '검사 (char_length (x) >, 5 와 char_length (x), # 39, & # 39 와 같은 Hello%& < 및 x = 20;)'
PostgreSQL 설명서 <블록쿼트>; 빈칸 채우기 유형을 사용할 때 저장 공간이 증가하고 길이가 제한된 열에 저장할 때 길이를 확인하기 위해 CPU 사이클이 몇 번 추가되는 것을 제외하면 세 가지 유형 간에 성능 차이는 없습니다. 일부 다른 데이터베이스 시스템에서는 character(n)이 성능상 이점이 있지만, PostgreSQL에서는 그러한 이점이 없으며, 실제로 추가 저장 공간 비용으로 인해 일반적으로 character(n)이 세 가지 유형 중 가장 느립니다. 대부분의 상황에서는 텍스트 또는 문자 가변을 대신 사용해야 합니다.
저는 보통 텍스트
참조: http://www.postgresql.org/docs/current/static/datatype-character.html
제 생각에는, '# 39 의 varchar (n)' 의 it& İç 장이점이. 네, 그들은 모두 동일한 기본 사용 유형과 락하였으니. 그러나 한다는 지적이 나오고 있는 PostgreSQL 는 크기 제한이 인덱스화합니다 2712 바이트입니다 한 행에.
DR:* TL;
'Text' 방식의 없이 사용하는 경우, 이러한 인덱스화합니다 구속조건으로 * 있고 열 수 있으며, 이 중 일부의 제한값 너회의 열 수 있는 가능성이 매우 높습니다 안타 때 단순화표현 삽입하려면 varchar (n) 를 사용하여 데이터 오류 '하지만' 막을 수 있습니다.
좀 더 details: 문제입니까 에로남이네 PostgreSQL doesn& 'text' t give indexe 만들 때, 모든 예외를 # 39 의 varchar (n) '또는' 유형 'n' creditbank. 2712 보다 크다. 그러나 이 때 함께 압축됨 크기 이상의 오류가 부여하느뇨 기록하십시오 2712 시도됩니다 스크램블된 삽입됨. 무슨뜻이냐믄 100.000 반복적인 문자를 삽입할 수 있는 캐릭터는 구체화하십시오 원하는거요 작곡한 압축할지 확장하지만 2712 못할 수 있기 때문에 쉽게 턱없이 낮은 일부 문자 스트링은 압축됨 크기 때문에 삽입하려면 dl4000 크면 2712 바이트입니다. 여기서 'n' '아니다' 를 사용하여 varchar (n) , * # 39 에서 이러한 오류는, re 안전하다구요 you& 2712 너무 큼.
다양한 (n) ',' varchar (n) - '문자' (모두 동일). 값 n 자 로 잘립니다 없이 오류가 있다. < br> < br>;;; '문자 (n)', '챨 (n)' - (모두 동일). 패드 비워집니다 길이 끝날 때까지 함께 고정 길이 될 것입니다. < br> < br>;;; 무제한 'text' 이다. < br> < br>;;;
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