인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

gmpark님의 프로필 이미지

작성한 질문수

Real MySQL 시즌 1 - Part 1

Ep.02 VARCHAR vs TEXT

2강. VARCHAR(255) 저장되는 데이터의 길이 정보 질문

작성

·

177

0

안녕하세요. 2강을 수강하면서 궁금한 점이 있어 질문 글 남깁니다.

 

VARCHAR(30) vs VARCHAR(255) 둘 중에서 데이터 타입을 선택할 때 실제 사용하는 길이만큼만 명시해 주는 게 메모리 사용 효율을 높일 수 있다고 말씀해주셨는데요.

VARCHAR(30)와 VARCHAR(255) 모두 저장되는 데이터의 길이 정보를 1 바이트(0~255 표현 가능)로 저장하는 것이 맞는걸까요?

강의 자료에 VARCHAR(30) vs VARCHAR(255) 차이를 설명할 때 '디스크 공간 효율 차이도 미미하게 존재(1바이트 vs 2바이트)'라고 적혀 있어 VARCHAR(255)에서 저장되는 데이터 길이 정보에 2바이트의 공간을 할당한다는 의미로 이해되어서요.

 

좋은 강의 감사합니다.

답변 2

1

백은빈님의 프로필 이미지
백은빈
지식공유자

안녕하세요. 답변이 늦었습니다.

우선 VARCHAR 타입에서 데이터 길이 정보는 저장된 데이터가 255 바이트일때까지는 1바이트, 그 이상의 경우 2바이트가 할당됩니다. 그리고 VARCHAR(255)에서 255는 문자의 길이를 나타내며, 저장되는 바이트 수를 제한하는 것이 아닙니다.

그렇기 때문에 질문주신 부분은 하나의 문자를 저장하는 데 몇 바이트를 필요로 하는지에 따라 달라진다고 볼 수 있으며, 이는 문자집합(Character Set)과 연관이 되어있습니다.

만약 컬럼이 문자 당 1바이트씩 사용하는 latin1 문자집합으로 설정돼있다면, 말씀하신 것처럼 VARCHAR(30)VARCHAR(255) 모두 저장되는 데이터의 길이 정보가 1바이트일 수 있습니다. 그런데 만약 문자 당 1바이트 이상 사용하는 다른 문자집합이라면 VARCHAR(255)는 데이터의 길이 정보로 2바이트를 가지게 됩니다.

구체적으로 utf8mb4 문자집합의 경우 최대 한 문자당 4바이트를 사용할 수 있는데요. 이 경우에는 VARCHAR(64)부터 데이터 길이 정보로 2바이트를 가질 수 있다고 보시면 됩니다.

좋은 질문 주셔서 감사하고, 추가로 궁금한 부분 있으시면 언제든지 다시 말씀해주세요. :)

수강 감사드립니다.

gmpark님의 프로필 이미지
gmpark
질문자

답변 감사합니다. 궁금했던 부분이 해결되었습니다.

현자타임님의 프로필 이미지

관련 내용을 조사하다 문의드립니다.

시간이 오래 지나서 답변이 어려울 수 있겠지만 혹시나 싶어 문의드려요

내용 중에 utf8mb4 문자집합의 경우 한 문자당 4바이트이기 때문에 VARCHAR(63) VARCHAR(64) 에 따라 1바이트 또는 2바이트로 길이 정보를 쓴다고 하셨는데요.

실제 저장 공간에 대한 차이가 발생하는지 테스트 해보고자 information_schema.tables 에 data_length 정보를 갖고 비교를 해봤는데 차이가 없습니다.

혹시 그 차이를 확인하고 성능 상에 문제는 어떤지 알 수 있을까요? 공식문서에는 그런 맥락의 내용은 없어 이렇게 남겨봅니다.

 

 

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다.

VARCHAR의 데이터 길이 저장 방식에 대해 궁금하신 부분이 있으시군요. 직접적인 차이를 설명하자면, VARCHAR 타입은 실제 저장되는 데이터의 길이를 저장하는 데에 사용되는 공간이 다를 수 있습니다.

MySQL에서는 VARCHAR 타입의 길이 정보는 일반적으로 1바이트 또는 2바이트를 사용해서 저장됩니다. 1바이트는 255까지의 길이를 저장할 수 있기 때문에, VARCHAR(255)까지는 1바이트를 사용하여 길이 정보를 저장할 수 있습니다. 그러나 VARCHAR(256) 이상의 경우에는 2바이트를 사용하여야 길이 정보를 저장할 수 있게 됩니다. 따라서, VARCHAR(255)까지는 1바이트의 길이 정보를 사용하고, 이 이상의 경우는 2바이트를 사용하게 됩니다.

이는 MySQL의 최적화 방식 중 하나로, 데이터베이스가 최대한 효율적으로 데이터를 저장하도록 하기 위한 것입니다.

질문 주신 내용에서 MySQL의 동작 원리에 대한 이해를 돕기 위해 추가 자료를 참고하실 수 있습니다:

기타 궁금한 부분에 대해서는 언제든지 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

gmpark님의 프로필 이미지

작성한 질문수

질문하기