Mysql에서 자주 사용되는 문자열 데이터 타입에 대해서 알아보자
고정형 데이터 타입이다. 데이터의 길이를 지정해 두면 정확히 지정된 만큼의 공간을 차지한다.
예를 들어 CHAR(5)로 컬럼의 속성을 지정했다고 가정해보자.
해당 컬럼에 각각 'HI'라는 문자열과 'HELLO'라는 문자열을 입력한다면,
'HI'는 2byte, 'HELLO'는 5byte지만 저장될 때는 똑같이 5byte를 할당 받는다.
이 때 남는 공간은 공백으로 채운다.
자칫 VARCHAR에 비해 비효율적인 공간할당 방식이라고 생각할 수 있지만,
고정형이기에 가변형 데이터와는 달리 추가연산이 필요없다. (값의 크기를 추정하는 등의...)
가변형 데이터 타입이다. 할당 받은 크기보다 작은 데이터라면, 그 데이터의 크기만큼의 공간을 할당한다.
위에서 든 예시를 그대로 써보자.
VARCHAR(5)에 각각 'HI'(2byte), 'HELLO'(5byte)를 입력한다고 가정했을때,
CHAR의 경우 입력받은 크기와 상관없이 할당받은 5byte를 똑같이 할당하지만
VARCHAR는 'HI'와 'HELLO'에 각각 2byte, 5byte를 할당한다.
VARCHAR는 저장할때 데이터뿐만 아니라 길이에 대한 값 역시 같이 저장된다.
데이터 | 속성 | 대응 범위 | 사용 예시 |
---|---|---|---|
CHAR | 고정형 | ~255byte (정확히 할당받은 만큼) | 크기가 고정된 자료 (ex. 우편번호, 전화번호, 학번 등) |
VARCHAR | 가변형 | 1~65535byte | 대다수의 문자열(ex. 이름, 이메일, 제목 등) |
공간을 낭비하는 CHAR 대신 다 VARCHAR로 쓰면 안될까? 하는 의문이 들 수도 있다.
사실 우리가 쓰는 대다수의 텍스트들이 고정된 길이로 쓰이는 경우는 드물다.
가장 기본적인 ID와 비밀번호만 해도 min-length, max-length 제한이 있을 순 없지만 정확히 특정 지정된 길이에 맞추는 경우는 없다. 그럼에도 왜 CHAR 속성을 사용할까?
바로 속도 때문이다. 고정형의 경우 Fixed-table이기 때문에 가변형인 Variable-table에 비해서 연산 속도가 빠르다. 근데 사실 체감할 정도의 속도 차이를 보이려면 어마어마한 양의 데이터 비교를 해야한다. 10만건 기준으로 대략 0.1초 정도의 차이를 보이는데 물론 이도 쌓이면 무시할 수 없는 속도 차이긴 하다.