텍스트와 varchar의 차이(문자에 따라 다름)
와의 차이는 무엇입니까?text과 「」를 참조해 주세요.character varying )varchar 타입 ★★★★★★★★★★★★★★★★?
문자 바리에이션이 길이 지정자 없이 사용되는 경우 이 유형에는 모든 크기의 문자열이 허용됩니다.후자는 포스트그레입니다.SQL 확장자
그리고.
또, 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는 보통 길이 제한에 대해 이들 중 하나를 선택하는 것이 가장 좋다고 결론짓습니다.
설명서의 "문자 유형"에서 알 수 있듯이,varchar(n),char(n) , , , , 입니다.text모두 같은 방식으로 저장됩니다.의 사이클이 하다는 것, 에는 여분의 입니다.char(n).
해야 하는 유형인 1을 ."char"을 사용법을 참조)필드에 더 빨리 액세스할 수 있으며 길이를 저장할 오버헤드가 없습니다.
명 랜덤 테이블을 ."char"이치노( 「」 「」 「」).select count(*), field ... group by field약되며, 에서는 약 됩니다.「 650 밀리초를 사용하고 있습니다.textsyslog.syslog.syslog.
(이 답변은 Wiki입니다.편집할 수 있습니다.수정 및 개선 부탁드립니다.)
2016년 벤치마크 갱신(9.5페이지 이상)
또한 "순수한 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년 어게인 갱신(10페이지)
2018년 결과를 추가하고 권장 사항을 보강하기 위해 약간의 수정이 필요합니다.
2016년, 2018년 실적
많은 기계와 많은 테스트에서 평균적으로 얻은 결과는 모두 동일합니다.
(서양속담, 친구속담)
권고
text"Datatype",
것을varchar(x)입니다.★★★★★★★★★★★★★★★★★,CREATE FUNCTION'''varchar(x)≠varchar(y).varchar★★★★★ by) by with.CHECK의 절CREATE TABLE
★★CHECK(char_length(x)<=10)
INSERT 및 구조 INSERT/UPDATE를 .
★★CHECK(char_length(x)>5 AND char_length(x)<=20 AND x LIKE 'Hello%')
포스트그레SQL 매뉴얼
빈 패드를 사용하면 저장공간이 늘어나고 길이가 제한된 컬럼에 저장할 때 길이를 확인하기 위한 CPU 사이클이 몇 번 추가되는 것 외에는 이 세 가지 유형 간에 성능 차이는 없습니다.일부 다른 데이터베이스 시스템에서는 문자(n)가 성능상의 이점이 있지만 Postgre에서는 이러한 이점이 없습니다.SQL. 실제로는 추가 스토리지 비용 때문에 일반적으로 3가지 중 가장 느립니다.대부분의 경우 텍스트 또는 문자 바리에이션을 사용해야 합니다.
나는 주로 문자를 사용한다.
참고 자료: http://www.postgresql.org/docs/current/static/datatype-character.html
제제 in in in in in invarchar(n)나름의 장점이 있습니다.네, 모두 같은 타입의 기본 타입을 사용합니다.그러나 Postgre의 지표는SQL의 크기 제한은 행당 2712바이트입니다.
TL;DR: 를 사용하는 경우text제약 없이 입력하고 이러한 열에 인덱스가 있습니다. 일부 열에 대해 이 제한에 도달하여 데이터를 삽입하려고 할 때 오류가 발생할 수 있습니다.varchar(n)할 수 , 예방할 수 있습니다.
상세 정보:문제는 Postgre가SQL은 다음에 대한 인덱스를 만들 때 예외를 두지 않습니다.text합니다.varchar(n)서 ''는n2712보다 .단, 압축 사이즈가 2712보다 큰 레코드를 삽입하려고 하면 오류가 발생합니다.즉, 반복문자로 구성된 문자열의 100.000자를 쉽게 삽입할 수 있습니다.이는 2712바이트를 훨씬 밑돌기 때문입니다.단, 압축된 사이즈가 2712바이트를 초과하기 때문에 4000자의 문자열을 삽입할 수 없는 경우가 있습니다.「」를 사용합니다.varchar(n)서 ''는n2712보다 크지 않습니다.이러한 에러로부터 안전합니다.
text 와 varchar 는 암묵적인 타입의 변환이 다릅니다.가장 큰 영향은 후행 공간을 처리하는 것입니다.예를 들어...
select ' '::char = ' '::varchar, ' '::char = ' '::text, ' '::varchar = ' '::text
true, false, true andtrue, true, true예상하신 대로입니다.
다소 OT: Rails를 사용하는 경우 웹 페이지의 표준 형식이 다를 수 있습니다. 폼의 text하지만, 「」은 「」입니다.character varying(레일)string의 상자는 1번으로 하다.이치
http://www.sqlines.com/postgresql/datatypes/text에서 제공하는 적절한 설명:
TEXT와 VARCHAR(n)의 유일한 차이점은 VARCHAR 컬럼의 최대 길이를 제한할 수 있다는 점입니다.예를 들어 VARCHAR(255)에서는 255자를 초과하는 문자열을 삽입할 수 없습니다.
TEXT와 VARCHAR의 상한은 모두 1 Gb로, 퍼포먼스 차이는 없습니다(Postgre에 의하면).SQL 문서).
전통과 현대의 차이점이다.
기존에는 각 테이블 열의 너비를 지정해야 했습니다.너비를 너무 많이 지정하면 비싼 스토리지 공간이 낭비되지만 너비를 너무 적게 지정하면 일부 데이터가 맞지 않습니다.그 후 컬럼 크기를 조정하고 연결된 많은 소프트웨어를 변경하여 발생한 버그를 수정해야 했습니다. 이 모든 것은 매우 번거롭습니다.
최신 시스템에서는 동적 스토리지 할당으로 문자열 스토리지를 무제한으로 사용할 수 있으므로 작은 데이터 항목을 저장하는 데 큰 낭비를 겪지 않고 부수적인 큰 문자열이 적절하게 저장됩니다.
많은 프로그래밍 언어들이 C#, javascript, java 등과 같은 무제한 크기의 데이터 유형을 채택했지만 Oracle과 같은 데이터베이스는 채택하지 않았습니다.
이제 그 포스트그레SQL은 '텍스트'를 지원하며 많은 프로그래머가 VARCHAR(N)에 익숙해져 있습니다.또한 VARCHAR을 사용하면 제한N을 추가할 수 있기 때문에 VARCHAR은 유연성이 향상됩니다.
이제 로 생활을 심플하게 할 수 있는데 굳이 를 사용해야 하는 이유는 무엇입니까?
Oracle에서 최근 몇 년간 CHAR(N) 또는 VARCHAR(N)을 사용한 적은 거의 없습니다.Oracle에는 무제한 문자열 유형이 없기 때문에 대부분의 문자열 열 VARCHAR(2000)에 사용했습니다. VARCHAR(2000)은 2000이 한때 VARCHAR의 최대값이었고, 모든 실질적인 목적은 'infinite'와 크게 다르지 않습니다.
이제 Postgre와 함께 일하게 되었으니SQL, TEXT가 진정한 진보라고 생각합니다.CHAR 타입의 VAR 기능은 더 이상 강조되지 않습니다.N이 없는 VARCHAR을 사용하는 것에 대해서는 더 이상 강조할 필요가 없습니다.또한 TEXT를 입력하면 VARCHAR에 비해 3개의 키 스트로크가 저장됩니다.
젊은 동료들은 옛날에는 무제한의 끈이 없었다는 사실조차 모른 채 자라곤 했다.대부분의 프로젝트에서와 마찬가지로 조립 프로그래밍에 대해 알 필요가 없습니다.
Postgre에 텍스트 대신 varchar를 사용하느라 너무 많은 시간을 낭비했다.SQL 어레이
PostgreSQL 어레이 연산자는 문자열 열과 함께 작동하지 않습니다.상세한 것에 대하여는, 다음의 링크를 참조해 주세요(https://github.com/rails/rails/issues/13127) 및 (http://adamsanderson.github.io/railsconf_2013/?full#10).
TEXT 유형만 사용하는 경우 AWS 데이터베이스 마이그레이션 서비스를 사용할 때 다음과 같은 문제가 발생할 수 있습니다.
LOB(대형 개체)가 사용되지만 대상 LOB 열은 null이 아닙니다.
LOB(Large Object)는 알 수 없는 크기로 인해 표준 객체보다 더 많은 처리 및 리소스가 필요합니다.LOB가 포함된 시스템의 이행을 조정하기 위해 AWS DMS는 다음과 같은 옵션을 제공합니다.
Postgre만 고집하는 경우SQL을 통해 모든 것을 할 수 있습니다.그러나 ODBC 또는 DMS와 같은 외부 도구를 통해 db와 대화하는 경우 TEXT를 사용하지 않는 것을 고려해야 합니다.
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
언급URL : https://stackoverflow.com/questions/4848964/difference-between-text-and-varchar-character-varying
'programing' 카테고리의 다른 글
| 스크립트의 소스 여부를 검출하는 방법 (0) | 2023.04.11 |
|---|---|
| std:: 문자열에서 char* (0) | 2023.04.11 |
| Windows에서 msysgit을 사용하여 Git 서버 설정 (0) | 2023.04.11 |
| Bash에서 어레이를 정렬하는 방법 (0) | 2023.04.11 |
| WPF 목록 상자의 열을 모든 항목에 대해 같은 너비로 만들려면 어떻게 해야 합니까? (0) | 2023.04.11 |