MySQL을 사용 중에 의문이 생겼습니다.
VARCHAR(255)에는 한글이 몇글자 저장될까?
이 글은 MySQL 공식문서를 참고했습니다.
CHAR의 길이는 선언할 때 고정됩니다. 길이는 0부터 255까지의 값으로 지정할 수 있습니다.
예를 들어 CHAR(30)으로 선언하면 문자열의 길이는 30으로 고정됩니다. 만약 이보다 짧은 문자열을 저장하면 오른쪽에 남은 길이만큼의 공백이 저장되게 됩니다.
VARCHAR는 가변 길이 문자열입니다. 길이는 0부터 65,535까지의 값으로 지정할 수 있습니다.
CHAR와 달리 VARCHAR는 데이터 앞에 1바이트 또는 2바이트의 공간에 문자열의 길이를 저장합니다. 문자열이 255바이트 이하의 공간을 사용하면 1바이트, 그 이상을 사용하면 2바이트를 사용하게됩니다.
CHAR, VARCHAR의 괄호 안에 길이를 지정하게 되는데요. 이 길이는 byte를 의미하는걸까요?
그렇지 않습니다. 문자의 개수를 의미합니다.
따라서 CHAR(10), VARCHAR(10)에는 한글이 10글자까지 들어갑니다.
그렇다면 VARCHAR(65535)엔 65535개의 한글이 들어가는걸까요?
정답: 아닙니다.
일단 인코딩에 대한 이해가 조금 필요합니다. 저는 실험을 위해
VARCHAR(65536) 타입의 열을 가진 테이블을 만들어보았습니다. 그런데 에러가 발생하더군요.
CREATE TABLE testTable(
id int NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT 'Primary Key',
name VARCHAR(65535)
);
오류 발생!!
Column length too big for column 'name' (max = 16383); use BLOB or TEXT instead
알아보니 저는 utf8mb4_0900_ai_ci 를 사용중이었습니다.
한글자가 4바이트인 인코딩이기 때문에 길이를 16383까지만 지정할 수 있었습니다. 마지막 한글자는 문자열 종료를 뜻하는 문자가 들어갈테구요.
정리해보겠습니다.
MySQL VARCHAR엔 한글이 얼마나 저장될까?
에 대한 답은 인코딩마다 다르다 65536byte까지 가능하다 였습니다.
다만 헷갈릴 수 있는 부분을 집고 넘어가자면
VARCHAR를 선언할 때 VARCHAR(10)과 같이 선언하면 한글이던 영어던 10글자까지 들어간다는 점입니다.
읽어주셔서 감사합니다. 틀린 점이 있다면 지적해주세요!