Programming/데이터베이스

[MySQL] 문자열 타입

Bam_t 2022. 1. 25. 17:51
728x90

숫자 타입에 이어서 MySQL의 문자열 타입에 대해 알아보겠습니다.

MySQL의 문자열 타입은 단순히 문자열만을 저장하는 역할 외에도 이미지나 동영상 등의 바이너리 파일도 저장이 가능한 타입입니다.


1. CHAR, VARCHAR

CHAR, VARCHAR는 가장 기본적인 문자열 타입입니다. 두 타입은 텍스트 문자열을 저장하고, 컬럼의 크기가 제한되어있습니다. 그렇다면 두 타입의 차이는 무엇일까요.

CHAR는 고정 길이를, VARCHAR는 가변 길이 문자열을 저장합니다. CHAR의 문자열이 지정한 크기보다 작으면 나머지 공간을 자동으로 채워주고 VARCHAR는 그렇지 않습니다. 무엇이 더 뛰어나다고는 할 수 없으므로 상황에 맞게 두 타입을 이용해야합니다.

예를 들어 학생부 데이터베이스에서 학번은 보통 8자리 내외로 고정되어있으니 CHAR를 이용하고, 이름은 2글자 이상 부터 다양하게 올 수 있으므로 VARCHAR를 이용하는 것이 효율적인 동작에 도움이 될 수 있습니다.

두 타입은 정의할 때 문자열의 최대길이를 표시합니다. 문자열은 0~255사이의 길이를 가질 수 있습니다.

CHAR(max-length);
VARCHAR(max-length);

 

 

 

2. BLOB, TEXT

방금전에 알아본 CHAR와 VARCHAR는 255 바이트까지 저장하는 문자열 타입이었습니다. 만약 255 바이트를 초과하는 문자열을 저장하려고 한다면 CHAR와 VARCHAR로는 저장할 수 없게됩니다. 그래서 큰 크기의 텍스트를 저장하기 위해서 BLOB과 TEXT를 이용합니다.

BLOB에 대해서 먼저 알아보겠습니단. BLOB은 Binary Large OBject의 줄임말입니다. 255 바이트 이상의 크기를 갖는 바이너리 데이터를 저장할 수 있는 타입이 BLOB입니다.

타입 최대 저장 바이트
TINYBLOB 255 byte
BLOB 65,532 byte
MEDIUMBLOB 16,777,215 byte
LONGBLOB 4,294,967,295 byte

TEXT는 대소문자를 구분하는 255 바이트 이상의 문자열의 데이터를 저장하는데 사용됩니다.

타입 최대 저장 바이트
TINYTEXT 255 byte
TEXT 65,532 byte
MEDIUMTEXT 16,777,215 byte
LONGTEXT 4,294,967,295 byte

VARCHAR 사용 시 최대 길이인 255 바이트를 초과하는 길이를 입력하면 자동으로 길이에 맞는 TEXT형으로 변환됩니다. (예, VARCHAR(777) => TEXT, VARCHAR(100000) => MEDIUMTEXT)

 

 

 

3. BINARY, VARBINARY

눈치가 빠르시다면 벌써 알 수 있을 수도 있는 타입입니다. 이 두 타입은 바이너리 데이터를 저장하는 타입입니다. CHAR는 BINARY와 VARCHAR는 VARBINARY와 길이, 사용법이 동일합니다.

 

 

 

4. ENUM, SET

ENUM과 SET은 열거형 데이터를 저장하는데 사용되는 타입입니다.

ENUM부터 알아보겠습니다. ENUM은 최대 65532개의 데이터를 저장할 수 있는 타입입니다. ENUM에 저장된 데이터 값들 중 하나의 데이터 값만이 선택되어 사용됩니다. ENUM에 저장된 문자열은 내부 동작에 의해 정수로 변환되고, 이들을 인덱스로 사용합니다. 기존의 프로그래밍과는 다르게 인덱스가 1부터 시작한다는 점도 주의해야합니다.

추가) 내부적으로는 0부터 시작하지만, 0은 빈 문자열 ''로 지정되고, 실제 데이터는 인덱스 1부터 시작합니다.

예를들어 대학교 학과 데이터베이스라면, ENUM에 (국어국문학과, 컴퓨터공학과, 법학과, ...) 이렇게 주르륵 저장하고, 학생의 학과에 따른 인덱스를 받아 하나의 데이터가 선택되어 사용됩니다.

ENUM('데이터1', '데이터2', '데이터3', ...)

SET도 역시 열거형 데이터를 저장합니다. ENUM과 다른 점은 최대 64개의 데이터를 저장할 수 있습니다. 또, ENUM은 내부 동작으로 정수로 데이터를 변환했으나, SET은 바이너리 데이터로 변환합니다. 그리고 여러개의 값을 선택할 수 있다는 점도 ENUM과는 다른 동작을 보여줍니다.

SET을 사용할 때는 데이터와 데이터 사이를 콤마로 구분하는데, 이 콤마 전후로 공백이 존재하면 안됩니다.

SET('데이터1','데이터2','데이터3',...)

 

 

 

5. 날짜와 시간 타입

날짜와 시간은 문자열은 아니지만, 추가로 다뤄볼까 해서 이번 포스팅에 추가했습니다. 날짜와 시간 타입에는 TIME, DATE, DATETIME, TIMESTAMP, YEAR가 존재합니다.

(Y: year, M: Month, D: Day, H: Hour, M: Minute, S: Second)

TIME은 시간을 저장할 때 사용합니다. 기본적으로 'HH:MM:SS'의 형태를 가지지만, 더 큰 시간의 범위인 'HHH:MM:SS'로도 표시될 수 있습니다. 'HH:MM:SS'의 형태는 '00:00:00'~'23:59:59'사이의 값을 가지고, 'HHH:MM:SS'는 '-838:59:59'~'838:59:59'사이의 값을 갖습니다.시간이 10보다 작은 경우라면 앞에 0을 생략할 수 있습니다. '1:2:3'은 '01:02:03'과 동일합니다.


DATE는 날짜값만을 필요로 할 때 사용합니다. 'YYYY-MM-DD'의 형태로 입/출력됩니다. DATE 타입은 '1000-01-01'~'9999-12-31'사이의 값을 가질 수 있습니다.


DATETIME은 날짜와 시간을 동시에 필요로 할 때 사용합니다. 'YYYY-MM-DD HH:MM:SS'의 형태로 입/출력됩니다. 날짜 범위는 DATE와 동일하고 시간은 '00:00:00'~'23:59:59'사이의 값을 갖습니다.


TIMESTAMP는 날짜와 시간을 동시에 필요로 하는 경우에 사용하는 점이 DATETIME과 동일합니다. 하지만 날짜 데이터를 입력해 주지 않는다면 데이터가 마지막으로 입력/수정된 날짜와 시간을 기록하는 타임스탬프 용도로 사용됩니다.


마지막으로 YEAR는 연도만을 필요로할 때 사용하는 타입입니다. 'YYYY'의 형태로 사용되며, 값의 범위는 1901~2155 사이의 값만을 가질 수 있습니다.

YEAR 타입의 특징은 2자리와 4자리로 끊어서 사용할 수 있다는 점인데, 2자리와 4자리의 경우 의미가 다릅니다.

  • 4자리인 경우에는 1901년~2155년을 나타냅니다.
  • 2자리이하인 경우는 1~69의 값은 2001년~2069년이 되고, 70~99사이의 값은 1970년~1999년을 나타냅니다.
  • 0인 경우에는 0000년을 의미하며, 2000년을 나타내려면, 문자열로 '0'또는 '00'으로 입력해야합니다.
728x90