[DB] VARCAHR vs CHAR vs TEXT 비교
RDB의 테이블 설계 중 문자열 데이터 저장을 위해 선택할 수 있는 데이터 타입에 대해 정리해 보았다.
(혹시 제가 작성한 부분 중 틀린 부분이 있다면 댓글로 남겨 주시면 수정하도록 하겠습니다.)
MySQL을 기준으로 주로 설명한 내용이므로. 다른 DB 벤더의 경우는 내용이 다를 수 있으니 꼭 해당 DB의 데이터타입에 대해 다시한번 확인이 필요하다
VARCHAR(n) | CAHR(n) | TEXT | |
크기지정 가능 여부 | O | O | X |
저장 가능한 문자열의 최대 크기 | - MySQL 5.0.3 버전 이후: 유효 최대 길이는 최대 열 크기(최대 65,535바이트)와 캐릭터 셋의 사용에 영향을 받는다. - MySQL 5.0.3 이전: 255 |
255 | 65535(byte) |
디스크 할당 크기 | 실제 데이터길이 + 1 또는 + 2 만큼 할당 ( 255글자 이하에는 +1, 그 이상은 +2의 추가 공간 필요) "abcd" => 5 byte |
선언된 데이터 크기만큼 할당 char(4) => 4 byte |
실제 데이터 길이 + 1 만큼 할당(varchar와 동일) |
특징 | 문자열에 뒷따르는 공백을 제거하지 않고 저장하고 읽음 | 선언된 길이모다 크기가 작은 데이터를 저장하는 경우 우측에 공백을 추가하여 저장 ex) char(4)에 "ab" 저장시 실제로 "ab "가 저장 됨 |
기본값(default)을 가질 수 없음 전체 컬럼의 index 생성 불가 |
적합한 도메인 | 사이즈가 작고 조회가 자주 발생하는 데이터 외래키로 이용이 필요한 경우 |
길이가 고정된 데이터 (주민등록번호, 사번, 전화번호 등) |
전체 문자열 비교를 하지 않는 문자열 사이즈가 큰 데이터 |
도메인의 데이타 타입 선택은 도메인도 중요하지만 실제 조회되는 빈도와 데이터의 추가 빈도 등을 고려해야 한다.
inline으로 저장되는 VARCHAR의 경우 데이터 크기가 크면 row가 늘어날수록 table 자체의 크기가 많이 늘어나게 되어 성능에 문제가 생길 수 있다고 하며, 총 row를 제한할수도 있다고 한다. 그러나 VARCHAR 조회의 속도면에서는 참조를 거치게 되는 TEXT보다 이득이 있다고 한다.
반대로 TEXT의 경우 row가 늘더라도 테이블 자체의 크기가 늘어나는 속도가 훨씬 느리기 때문에 row가 늘어남에 따른 성능저하가 없고, concurrent한 insert에 대해 성능이 뛰어나다고 한ㄷ.
그러나 이또한 어떤 engine을 사용하느냐, 어떤 설정을 적용하느냐에 따라 달라질 수 있기때문에 정답을 내리는것은 어려운 영역인것 같다.
간단히 예외적인 상황을 고려하지 않는다고 할때
사이즈가 단어수준이나 한문장 이하의 사이즈를 가지고 잦은 조회가 필요한 데이터는 VARCHAR가 적절할것 같고, 두문장이상 또는 문단단위의 사이즈가 큰 데이터에 대해서는 TEXT를 이용하는것이 적합하지 않을까 조심스럽게 결론을 내려보고 싶다.
추가)
VARCHAR VS TEXT
VARCHAR와 TEXT는 65535 길이를 지원하는 공통점을 가지고 있습니다.
VARCHAR는 데이터 저장시 TABLE ROW에 직접 데이터를 저장하지만, TEXT의 경우 다른 영역에 데이터를 저장하고 해당 OFFSET을 테이블 ROW에 가지고 있습니다.
하지만 이또한 데이타 사이즈, 컬럼 사이즈, row format, MySQL버전에 따라 달라질 수 있기 때문에, 무조건은 아니라는 점 참고 하길 바란다.
TEXT 타입의 종류
TEXT 데이터와 동일하지만 사이즈만 다른 데이터 타입이 존재
Type | Maximum length
-----------+-------------------------------------
TINYTEXT | 255 (2 8−1) bytes
TEXT | 65,535 (216−1) bytes = 64 KiB
MEDIUMTEXT | 16,777,215 (224−1) bytes = 16 MiB
LONGTEXT | 4,294,967,295 (232−1) bytes = 4 GiB
VARCHAR VS CHAR
같은 길이의 데이터를 저장한다면 성능상 VARCHAR보다 CHAR가 유리하다.
VARCHAR는 크기를 연산하기 위한 약간의 오버헤드가 필요하기 때문이다.
참조:
dev.mysql.com/doc/refman/5.7/en/create-index.html
stackoverflow.com/questions/2023481/mysql-large-varchar-vs-text/2023513#2023513
stackoverflow.com/questions/25300821/difference-between-varchar-and-text-in-mysql
MySQL: Large VARCHAR vs. TEXT?
I've got a messages table in MySQL which records messages between users. Apart from the typical ids and message types (all integer types) I need to save the actual message text as either VARCHAR or...
stackoverflow.com