MySQL VARCHAR엔 한글이 얼마나 저장될까?

이승규·2023년 10월 24일
2

MySQL을 사용 중에 의문이 생겼습니다.
VARCHAR(255)에는 한글이 몇글자 저장될까?

이 글은 MySQL 공식문서를 참고했습니다.

CHAR, VARCHAR

CHAR

CHAR의 길이는 선언할 때 고정됩니다. 길이는 0부터 255까지의 값으로 지정할 수 있습니다.
예를 들어 CHAR(30)으로 선언하면 문자열의 길이는 30으로 고정됩니다. 만약 이보다 짧은 문자열을 저장하면 오른쪽에 남은 길이만큼의 공백이 저장되게 됩니다.

VARCHAR

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글자까지 들어간다는 점입니다.

읽어주셔서 감사합니다. 틀린 점이 있다면 지적해주세요!

profile
백엔드 개발자

0개의 댓글