MySQL VARCHAR 데이터 타입 개요
VARCHAR 데이터 타입은 가변 길이 문자 데이터를 저장하며, 단일 바이트 문자와 멀티바이트 문자를 모두 지원합니다. 이 데이터 타입의 문법은 VARCHAR(n) 형태로, 여기서 n은 저장할 수 있는 최대 문자 수를 의미하며 테이블을 생성할 때 반드시 지정해야 합니다.
MySQL 5.0.3 미만 버전에서는 n의 값이 0~255 범위로 제한되었지만, MySQL 5.0.3부터는 0~65,535 범위까지 확장되었습니다.
문자셋에 따른 최대 저장 가능 문자 수
VARCHAR에 실제로 저장할 수 있는 최대 문자 수는 최대 행(row) 크기와 사용하는 문자셋(character set)에 따라 달라집니다.
- ASCII 문자셋: 문자당 1바이트를 사용하므로 최대 65,535자까지 저장할 수 있습니다.
- utf8 문자셋: 문자당 3바이트를 사용하므로 최대 약 21,844자까지만 저장할 수 있습니다.
여기서 중요한 점은 MySQL의 최대 행 크기 제한이 65,535바이트라는 것입니다. 즉, BLOB 타입을 제외한 테이블의 모든 열을 합친 전체 크기가 65,535바이트를 초과해서는 안 됩니다.
예제
다음은 두 개의 VARCHAR 열을 가진 테이블을 생성하는 예제입니다.
mysql> CREATE TABLE var_test(FName VARCHAR(32765) NOT NULL, LName VARCHAR(32766) NOT NULL); Query OK, 0 rows affected (0.25 sec)
위 쿼리는 FName VARCHAR(32765)와 LName VARCHAR(32766), 두 개의 열을 가진 테이블을 성공적으로 생성했습니다. 전체 길이는 다음과 같이 계산됩니다.
32765 + 2 + 32766 + 2 = 65535
(각 열마다 길이 정보를 저장하는 데 2바이트가 추가로 사용됩니다.)
그렇다면 각 열의 길이를 1씩 더 늘리면 어떻게 될까요?
mysql> CREATE TABLE var_test1(FName VARCHAR(32766) NOT NULL, LName VARCHAR(32766) NOT NULL); ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs
위 쿼리에서 볼 수 있듯이, 길이를 1바이트만 늘렸을 뿐인데도 MySQL은 행 크기 초과 오류(ERROR 1118)를 반환합니다. 오류 메시지에서 안내하듯이, 이 경우 일부 열을 TEXT나 BLOB 타입으로 변경해야 합니다.
정리
VARCHAR의 최대 길이는 이론상 65,535자이지만, 실제로는 행 크기 제한(65,535바이트)과 문자셋의 바이트 수에 따라 결정됩니다. 따라서 테이블을 설계할 때는 각 열의 길이뿐 아니라 다른 열들과의 합계, 그리고 사용하는 문자셋까지 함께 고려해야 합니다.