VARCHAR과 CHAR의 차이점은 무엇입니까?


366

MySQL에서 VARCHAR과 CHAR의 차이점은 무엇입니까?

MD5 해시를 저장하려고합니다.


15
MD5 해시는 항상 32 자입니다. 따라서 CHAR은 고정 길이이므로 성능을 최대화하려면 CHAR (32)를 사용하십시오 (CHAR과 VARCHAR의 차이점에 대한 자세한 내용은 아래 답변 참조).
Augustin

답변:


361

VARCHAR 가변 길이입니다.

CHAR 고정 길이입니다.

콘텐츠가 고정 된 크기 인 경우으로 더 나은 성능을 얻을 수 CHAR있습니다.

자세한 설명 은 CHAR 및 VARCHAR 유형 의 MySQL 페이지를 참조하십시오 (주석도 읽으십시오).


51
@ 스티븐 : 언제 Anon. "콘텐츠가 고정 된 크기입니다"라고 표시되면 테이블의 행에 모든 고정 된 크기 필드가 포함되어야합니다. 한 필드에서 VARCHAR에 대해 CHAR을 사용하면 테이블에 VARCHAR 인 다른 필드가 포함되어 있으면 성능이 향상되지 않습니다.
Marco Demaio

2
char 데이터 유형은 성능을 추가하지 않습니다 ... 쿼리를 실행하는 동안 sql은 실행 계획을 생성합니다. charcol char (2000) 및 VarcharCol Varchar (2000)의 열이 2 개라고 가정합니다. 실행 계획에서 varchar 유형의 열에 대한 예상 행 크기가 예상보다 작을 수 있습니다. 따라서 유출이 임시 db로 이어집니다. 따라서 숯불을 사용하는 것이 성능에 좋습니다
vignesh

1
VARCHAR (n)의 마비에서 값의 의미는 무엇입니까?
시바 가미 남비

@Marco Demaio 당신은 이것의 이유를 알고 있습니까?
Dehan de Croos

1
@ jdc91 : 성능을 높이려면 전체 행의 너비가 고정되어야합니다. MySQL은 이러한 종류의 테이블에서 공간 요구 사항과 행 오프셋을 계산하는 데 유리합니다.
Marco Demaio

225

  1. 고정 길이의 문자열 값을 저장하는 데 사용됩니다 .
  2. 최대 번호 데이터 유형이 보유 할 수있는 문자 수는 255 자 입니다.
  3. 그것은이다 50 % 더 빠른 VARCHAR보다.
  4. 정적 메모리 할당을 사용합니다 .

바차

  1. 가변 길이 영숫자 데이터 를 저장하는 데 사용됩니다 .
  2. 이 데이터 유형이 보유 할 수있는 최대 값은 최대
    • MySQL 이전 5.0.3 : 255 자 .
    • Post-MySQL 5.0.3 : 65,535자가 행에 대해 공유되었습니다.
  3. 그것은의 느린 CHAR보다.
  4. 동적 메모리 할당을 사용합니다 .

3
이 답변이 너무 자주 투표되었다는 것에 약간 놀랐습니다. MySQL 문서 상태Values in VARCHAR columns are variable-length strings. The length can be specified as a value from 0 to 255 before MySQL 5.0.3, and 0 to 65,535 in 5.0.3 and later versions.
DroidOS

2
당신이 너무 문자에 숫자 데이터를 저장할 수 말할 것도없고
ninjabber

44
이 50 %는 무엇을 기준으로 더 빠릅니까? 무엇을하는 데 50 % 더 빠릅니까? 어떤 조건에서? 이 맥락에서 정적 메모리 할당 대 동적은 무엇을 의미합니까?
Martin Smith

4
@MartinSmith 나는 똑같은 질문을 할 것입니다. 정보가 정확하다고 생각하지 마십시오. asktom.oracle.com/pls/asktom/…
Ozgur Bar

2
-1; 여기서 성능 주장은 모호하고 입증되지 않았으며, 메모리 할당 전략의 차이 (그리고 중요한 이유)는 밝혀지지 않았으며 varchar가 "영숫자 데이터"를 저장한다는 주장은 약간 이상합니다. varchar 열은 영숫자가 아닌 문자도 확실히 저장할 수 있습니다!
Mark Amery 17

122

CHAR 대 VARCHAR

CHAR는 고정 길이 크기 변수
에 사용됩니다. VARCHAR은 가변 길이 크기 변수에 사용됩니다.

예 :

Create table temp
(City CHAR(10),
Street VARCHAR(10));

Insert into temp
values('Pune','Oxford');

select length(city), length(street) from temp;

출력은

length(City)          Length(street)
10                    6

결론 : 스토리지 공간을 효율적으로 사용하려면 가변 길이가 가변 인 경우 VARCHAR 대신 CHAR을 사용해야합니다.


4
도시 = CHAR (10), 거리 = VARCHAR (10), 도시 = 푸네, 거리 = 옥스포드, 길이 (시) = 4, 길이 (거리) = 6
abdulwadood

2
이 쿼리 (select length (city), length (street) from temp)는 mysql 5.7에서 다음 출력을 제공합니다. mysql> select length (city), length (street) from temp; + -------------- + ---------------- + | 길이 (도시) | 길이 (거리) | + -------------- + ---------------- + | 4 | 6 | + -------------- + ---------------- + 1 행 세트 (0.00 초)
Jasbeer Rawal

69

CHAR(x)열은있을 수 정확히 x 문자. 열 수 있습니다 최대 문자.
VARCHAR(x) x

MD5 해시는 항상 같은 크기이므로을 사용해야합니다 CHAR.

그러나 먼저 MD5를 사용해서는 안됩니다. 그것은 알려진 약점을 가지고 있습니다.
대신 SHA2를 사용하십시오.
암호를 해싱하는 경우 bcrypt를 사용해야합니다.


44
"CHAR (x) 열은 정확히 x 문자 만 가질 수 있습니다." 실제로, 당신은 x 문자보다 적은 데이터를 추가 할 수 있지만, 당신은 항상 10 문자의 메모리를 항상 뒤에서 예약한다는 것을 의미한다고 생각합니다.
Dan W

13
md5 해시를 저장하는 이유를 모르는 경우 보안과 관련이없는 md5를 사용해야하는 많은 이유가 있습니다. 충돌이 전혀 발생하지 않으며 알고리즘이 더 안전한 것보다 빠릅니다.
John Hunt

1
CHAR (x) 열이 x 문자를 정확하게 적용하지 않는다고 가정하면 고정 크기 데이터의 경우에도 VARCHAR (x)보다 X 문자를 사용해야하는 이유가 있습니까?
NeverEndingQueue

11

MySQL에서 VARCHAR과 CHAR의 차이점은 무엇입니까?

이미 답변을 제공하기 위해 OLTP 시스템 또는 업데이트가 자주 발생하는 시스템 에서 업데이트 중에 열 조각화 CHAR가 가능하므로 가변 크기 열에도 사용 하는 것이 VARCHAR좋습니다.

MD5 해시를 저장하려고합니다.

보안이 중요한 경우 MD5 해시는 최선의 선택이 아닙니다. 그러나 해시 함수를 사용하는 BINARY경우 대신 해시 유형을 고려 하십시오 (예 : MD5는 16 바이트 해시를 생성하므로 16 진수를 나타내는 32 자 BINARY(16)대신에 충분 하므로 CHAR(32)공간을 절약하고 성능을 향상시킬 수 있습니다.


이 사고에 따라 가독성 대 효율성을 위해 비즈니스 ID에 CHAR을 사용합니다. 그래도 bigint 기본 키를 사용합니다.
Archimedes Trajano

9

입력 한 문자가 선언 된 길이보다 짧은 경우 Varchar는 후행 공백을 차단하지만 char은 그렇지 않습니다. Char는 공백을 채우고 항상 선언 된 길이의 길이입니다. 효율성 측면에서 varchar는 문자를 잘라내어 더 많은 조정을 할 수 있기 때문에 더 능숙합니다. 그러나 char의 정확한 길이를 알고 있으면 char이 약간 더 빠른 속도로 실행됩니다.


7

오늘날 대부분의 RDBMS에서는 동의어입니다. 그러나 여전히 구별이있는 시스템의 경우 CHAR 필드는 고정 너비 열로 저장됩니다. 이를 CHAR (10)으로 정의하면 10 개의 문자가 테이블에 기록되며, 여기서 "패딩"(일반적으로 공백)은 데이터가 사용하지 않는 공간을 채우는 데 사용됩니다. 예를 들어, "bob"을 저장하면 ( "bob"+7 공백)으로 저장됩니다. VARCHAR (가변 문자) 컬럼은 CHAR 컬럼이 수행하는 추가 공간을 낭비하지 않고 데이터를 저장하기위한 것입니다.

항상 그렇듯이 Wikipedia 는 더 크게 말합니다.


5

CHAR은 고정 길이 필드입니다. VARCHAR은 가변 길이 필드입니다. 이름과 같이 길이가 가변적 인 문자열을 저장하는 경우 VARCHAR을 사용하십시오. 길이가 항상 같으면 약간 더 크기가 작고 약간 빠르기 때문에 CHAR을 사용하십시오.


여기서 속도와 스토리지 효율성에 대한 주장이 사실 이라고 생각 하지만 , 그 중 어느 것도 어떤 방식으로도 입증되지 않았으며 (거짓이라는 것이 완벽하게 그럴듯하지도 않음),이 답변은 유용하지 않습니다. 그것은 진정으로 그것을 확인하는 데 도움이되는 일을하지 않고 독자가 이미 진실했을 것으로 예상했던 것을 반복합니다.
Mark Amery

1

CHAR은 고정 길이이고 VARCHAR은 가변 길이입니다. CHAR은 항상 항목 당 동일한 양의 스토리지 공간을 사용하지만 VARCHAR은 실제 텍스트를 저장하는 데 필요한 양만 사용합니다.


1

char는 고정 길이 문자 데이터 형식이고 varchar는 가변 길이 문자 데이터 형식입니다.

char은 고정 길이 데이터 유형이므로 char 값의 저장 크기는이 열의 최대 크기와 같습니다. varchar는 가변 길이 데이터 형식이므로 varchar 값의 저장소 크기는이 열의 최대 크기가 아니라 입력 한 데이터의 실제 길이입니다.

열의 데이터 항목이 동일한 크기 일 것으로 예상되는 경우 char을 사용할 수 있습니다. 열의 데이터 항목 크기가 크게 달라질 것으로 예상되는 경우 varchar를 사용할 수 있습니다.


0

고성능 MySQL 책 에 따르면 :

VARCHAR 은 가변 길이 문자열을 저장하며 가장 일반적인 문자열 데이터 유형입니다. 필요한만큼의 공간 만 사용하므로 고정 길이 유형보다 저장 공간이 적게 필요할 수 있습니다 (즉, 더 짧은 값을 저장하는 데 사용되는 공간이 적습니다). ROW_FORMAT = FIXED로 작성된 MyISAM 테이블은 예외이며 각 행에 대해 디스크의 고정 된 공간을 사용하므로 공간을 낭비 할 수 있습니다. VARCHAR은 공간을 절약하므로 성능을 향상시킵니다.

CHAR 은 고정 길이입니다. MySQL은 항상 지정된 수의 문자에 충분한 공간을 할당합니다. CHAR 값을 저장할 때 MySQL은 후행 공백을 제거합니다. (이것은 MySQL 4.1 및 이전 버전의 VARCHAR에서도 마찬가지였습니다. CHAR 및 VAR CHAR은 논리적으로 동일하며 스토리지 형식에서만 다릅니다.) 값은 비교에 필요한대로 공백으로 채워집니다.


2
" VARCHAR는 공간을 절약하기 때문에 성능을 향상시킵니다. " 공간을 절약합니다. 그러나 성능에 부정적인 영향을 미치지 않습니까? VARCHAR필요에 따라 동적으로 메모리를 할당해야하므로 성능이 저하되지 CHAR않습니까?
Spikatrix

@Spikatrix는 다릅니다. VARCHAR 값이 종종 작지만 최대 N 바이트 일 수있는 경우 동적 할당은 상당한 양의 공간과 I / O를 절약 할 수 있으며, 이는 많은 데이터에 더 성능이 좋습니다. 길이가 대략 동일한 CHAR 값이 더 성능이 좋습니다. 읽기 대 쓰기도 차이가있을 수 있습니다.
Andrew

-4

Char 길이가 고정되어 있으며 (2000 자 지원) 문자를 나타내는 데이터 형식입니다.

Varchar 길이가 가변적 임 (4000 자 지원)


-1; 이 숫자는 MySQL에 적합하지 않습니다. (나는 그들이 오라클이 될 것 같아요?)
마크 Amery

-5

문자 또는 varchar-길이를 괄호로 표시 할 수있는 텍스 털 데이터를 입력하는 데 사용됩니다 (예 : char).


이것은 원래의 질문을 다루지 않습니다. OP는 형식의 구문과 목적이 아니라 형식 간의 실제 차이점을 묻습니다. 또한 ()하지 괄호 괄호입니다.
2mac

@ 2mac 최종 문장은 미국 영어에만 해당됩니다. 영국에서 우리는 전화 ()브래킷, 많은 영국인은 아마 단어 "괄호"구두점을 참조 할 수있는 영어의 방언이 있다는 것을 인식하지 않습니다. "괄호"를 "브래킷"보다 선호하는 강력한 사례가 있습니다. 아마도 국제 사용자를 대상으로 할 때 최대한 명확한 옵션 일 것입니다. 그러나 "브래킷"보다는 잘못된 경우 일뿐입니다.
Mark Amery

-11

CHAR :

  • 문자와 숫자를 모두 지원합니다.
  • 2000자를 지원합니다.
  • 고정 길이.

바차 :

  • 문자와 숫자를 모두 지원합니다.
  • 4000자를 지원합니다.
  • 가변 길이.

다른하실 말씀 있나요......!!!!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.