안녕하세요 코북입니다. 오늘은 문자열 자료형인 CHAR와 VARCHAR의 차이점에 대해서 공부했습니다. 모르는 게 생기면 적어둔 다음 바로 공부할 계획을 세우는데, 막상 하려고 하면 뭔가 항상 미루게 되는 것 같습니다. 어쩔 때는 계획을 안 세우는 게 실행에 더 도움이 되는 것 같기도 합니다ㅎ... 아무튼 표로 CHAR와 VARCHAR를 비교해보면 다음과 같습니다. (+TEXT)
Type | Description | Byte |
CHAR | 고정형 | n <= 255 |
VARCHAR | 가변형 | n <= 65535 |
TEXT | 가변형 | n <= 65535 |
CHAR VARCHAR 차이점
CHAR는 말 그대로 고정형입니다.
ex) CHAR(8)로 선언 시 글자를 한 개를 넣든 두 개를 넣든 8바이트의 공간을 차지합니다.
VARCHAR는 반대로 가변형 문자열이기 때문에 데이터의 길이에 따라서 가변적으로 길이가 정해집니다.
ex) VARCHAR(8)로 선언 시 글자를 한 개를 넣으면 1바이트, 2개를 넣으면 2바이트의 공간을 유동적으로 차지합니다.
※ VARCHAR = variable + char
CHAR는 경우에 따라 데이터가 낭비될 수 있지만 추후 연산이 필요 없기 때문에 검색속도 및 읽히는 속도가 VARCHAR에 비해 빠르다는 장점이 있습니다. 글자 수가 고정되는 경우에 사용하면 데이터를 보다 효율적으로 관리할 수 있습니다.
ex) 주민등록번호, 전화번호, 사원번호 등
VARCHAR는 입력받은 데이터의 크기가 작을 경우, 그 크기만큼만 메모리를 차지하므로 메모리 사용량을 줄일 수 있다는 장점이 있습니다.
또한 VARCHAR는 insert나 update가 있을 때 현재 자신이 차지하고 있는 영역이 얼마인지 확인하고, 부족한 경우 더 할당하고 남으면 줄여서 insert합니다. 하지만 CHAR는 고정된 길이의 값을 넣는 것이기 때문에 일단 밀어 넣고, 남는 부분을 공백으로 채우게 됩니다.
차이점만 있는 것은 아니고, 공통점도 있습니다.
CHAR VARCHAR 공통점
1. 문자열을 데이터 타입으로, 싱글쿼터(' ')로 값을 나타냅니다.
2. 대소문자를 구분합니다.
3. 한글은 한 글자당 3byte, 영문자는 알파벳 하나당 1byte의 크기를 가집니다.
4. 설정된 크기를 초과할 경우, 메모리를 초과한 나머지 값은 저장되지 않습니다.
ex) CHAR(20)으로 했을 경우 20byte만큼만 공간이 할당되기 때문에 20byte를 넘어가면 데이터가 잘리게 됩니다.
이러한 특성은 VARCHAR도 동일합니다.
※ mysql 5 버전부터는 괄호 안의 숫자가 byte가 아닌 글자 수를 의미합니다.
VARCHAR와 TEXT의 차이점
Index의 일부로 사용 가능 여부
- VARCHAR : 가능
- TEXT : 불가능
max size limit 가능 여부
- VARCHAR : 있다, 1~65535
- TEXT : 없다, only 65535
저장된 character 이외의 현재 저장된 String의 저장 공간
- VARCHAR : x <= 255 then, 1byte, 256 <= x <= 65535 then, 2byte
- TEXT : only 2byte
실제 사용에 있어서 ID, 이메일, 제목과 같은 간단한 정보(비교적 짧은 문자열)는 주로 VARCHAR를 이용하고, 댓글이나 신문기사와 같은 긴 문장 종류들은 TEXT를 이용한다고 합니다. 또한 데이터가 자주 검색되는 경우 VARCHAR로 저장하는 것이 더 빠르다고 합니다.
배운 점
DB설계를 하거나 쿼리를 작성할 때, 문자라면 VARCHAR를 사용하고 숫자라면 INT를 사용하는 식으로 외워서 사용을 해왔었습니다. 하지만 같은 문자 안에서도 많은 데이터 타입이 존재했고, 그 데이터 타입들을 고정적으로 사용하는 것이 아니라 실제 속도나 성능을 고려하여 사용해야 한다는 것을 배울 수 있는 시간이었습니다.
본 글은 아래 링크의 내용을 참고하여 학습한 내용을 나름대로 정리한 글임을 밝힙니다.
https://stackoverflow.com/questions/2023481/mysql-large-varchar-vs-text
https://www.codeit.kr/community/threads/17667
https://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=qna_db&wr_id=165889&page=688
https://b.jihoo.kr/usr/article/detail?id=28
'DataBase' 카테고리의 다른 글
[MSSQL] 프로시저 (PROCEDURE) (0) | 2022.02.24 |
---|---|
[MSSQL] GO의 의미 (0) | 2022.02.24 |
[MySQL] select 0 from A (select 1 from A) (0) | 2022.02.23 |
[MySQL] 기초 문법 정리 (0) | 2022.02.15 |
[MySQL] WEEKDAY(), CASE문 사용해 차트에서 '요일' 구현 (0) | 2021.11.01 |