MySQL의 문자열 타입 & 타입 선택 팁! (+BINARY data?)

Benjamin·2022년 8월 17일
0

DB

목록 보기
1/8

CHAR과 VARCHAR

문자열 데이터 타입

CHAR?

CHAR(M)
고정길이 문자열
M = 저장할 수 있는 문자열의 최대길이
M의 범위 = 0~255
설정크기보다 작은 길이의 문자열이 입력되면, 나머지 공간을 공백으로 채워 길이를 M으로 만든다.

VARCHAR?

VARCHAR(M)
가변길이 문자열
M = 저장할 수 있는 문자열의 최대길이
M의 범위 = 0~65,535
실제 입력된 문자열의 길이만큼만 저장하고 사용한다.


BINARY와 VARBINARY

  • BINARY(n) & BYTE(n) = CHAR 형태의 이진 데이터 타입
  • VARBINARY(n) = VARCHAR의 형태의 이진 데이터 타입
    바이너리 데이터를 저장할 때 사용
    BINARY(M)
    VARBINARY(M)

BLOB과 TEXT

BLOB = Binary Large Object. 다양한 크기 바이너리 데이터 저장
저장할 수 있는 데이터 최대 크기 따라 나뉨

  • TINYBLOB = 최대 255byte
  • BLOB = 최대 65535byte
  • MEDIUMBLOB = 최대 16777215byte
  • LONGBLOB = 최대 4294967295byte

TEXT = VARCHAR와 비슷하지만, 기본값을 가질 수 없음. BLOB과 비슷하지만 문자열의 대소문자 구분함. 저장할수 있는 데이터 최대 크기 따라 나뉨

  • TINYTEXT = 최대 255byte
  • TEXT = 최대 65535byte
  • MEDIUMTEXT = 최대 16777215byte
  • LONGTEXT = 최대 4294967295byte

+BINARY data?

바이너리 파일 = 데이터의 저장과 처리를 목적으로 0과 1의 이진 형식으로 인코딩된 파일
엄밀히, 모든 data혹은 file은 binary data이다.
-> 모든 텍스트 파일이 binary file
-> 그러나 모든 binary file이 텍스트 파일은 아니다.
텍스트 경우는 상관없지만, 이미지와 같은 다른 파일은 가급적 binary로 읽고쓰는것을 추천한다.(string으로저장시 출력하면 오류 남)

  • 기본적으로 컴퓨터의 모든 데이터는 binary. 다만 이를 필요에 따라 text로 변형해서 처리한다. 보통 파일 스트림에는 그 앞에 이 아이가 text인지 binary인지 표시해주느 부분이 있다. 이를 통해 컴퓨터가 파악하고, 읽거나 출력하는것을 진행.
  • 우리가 흔히 쓰는 텍스트의 경우 binary일 수도, text일 수도 있다. 양 쪽 모두 저장 가능하지만 image는 기본적으로 무조건 binary

ENUM

미리 정의한 집합 안의 요소 중 하나만을 저장할 수 있는 타입(단일 선택 가능)
가독성 증가, 특정 숫자에 문자열로 의미를 부여할 수 있다.
ENUM목록 집합은 최대 65,535개의 ENUM데이터를 포함할 수 있다.
ENUM데이터는 내부적으로 정수로 변환되어 인식된다.
ENUM('데이터값1','데이터값2',...)
ENUM 목록 집합의 각 데이터는 내부적으로 0부터 시작하여 1씩 증가하며 각각 대응된다.
단, 0은 빈 문자열('')과 대응되며, 1부터 집합의 첫 번째 요소와 대응된다.
단점 = 컬럼에 저장되는 문자열의 값이 새롭게 추가 되는경우, 테이블 구조를 변경해야 한다.


SET

미리 정의한 집합 안의 요소 중 여러 개를 동시에 저장할 수 있는 타입.(복수선택 가능)
SET의 목록 집합은 최대 64개의 SET 데이터를 포함할 수 있다.
SET('데이터값1', '데이터값2', ...)


데이터 타입 선택 방법

적합한 데이터 타입을 고르는 것은 좋은 성능을 얻는 데 필수적.

  • 타입은 작게!
    작은 데이터 타입일수록 디스크나 메모리, CPU 캐시에 더 적은 공간을 사용하기 때문에 더 빠르고, 덜 소비한다.
    하지만, 이후에 스키마에서 데이터 타입의 범위를 늘리는 작업은 어렵기 때문에, 잘 생각해서 선정하도록!

  • 타입은 단순하게!
    간단한 데이터 타입을 처리할수록 CPU 사이클로 덜 소비한다.
    예 ) 문자 비교는 Character set과 Collation으로 인해 복잡해지므로, 문자 비교보다는 정수 비교가 비용이 더 저렴하다.
    -> 날짜,시간은 문자열로 저장하지말고, MySQL의 내장 형식에 저장해야 하며 IP주소는 정수를 이용해 저장
    -> IP 주소를 사용할 수 있는 함수 = INET_ATON, INET_NTOA

  • 가능하면 NULL 금지!
    컬럼은 되도록 NOT NULL로 정의.
    NULL허용 컬럼은 저장 공간도 더 많이 사용하고, NULL 허용 컬럼을 인덱싱할 땐 항목마다 한 바이트씩 더 들어간다.
    NULL대신 0이나 특수한 어떤 값, 빈 문자열 등을 사용하는 걸 고려하자

0개의 댓글