데이터베이스에 데이터가 저장되면 각 데이터마다 용량을 차지하기 때문에
방대한양의 데이터를 효율적으로 저장해야 한다
그래서 다양한 데이터 타입(자료형)을 정리해 보았다
데이터 타입에는 숫자, 문자열, 날짜, 기타 4가지 종류가 있다
숫자 데이터 타입
| 데이터 타입 | 바이트 수 | 숫자 범위 | 설명 |
| BIT(N) | N/8 byte | 1~64bit | 비트 단위로 저장 b'0101' 과 같이 표현 |
| TINYINT | 1byte | -128 ~ 127 | 정수 |
| SMALLINT | 2byte | -32,768 ~ 32,767 | 정수 |
| MEDIUMINT | 3byte | -8,388,608 ~ 8,388,607 | 정수 |
| INT(INTEGER) | 4byte | 약 -21억 ~ +21억 | 정수 |
| BIGINT | 8byte | 약 -900경 ~ +900경 | 정수 |
| FLOAT | 4byte | -3.40E+38 ~ -1.17E-38 | 부동 소수점, 소수점 아래 7자리까지 표현 |
| DOUBLE (DOUBLE PRECISION) |
8byte | 1.22E-308 ~ 1.79E+308 | 부동 소수점, 소수점 아래 15자리까지 표현 |
| DECIMAL(m, d) | 5 ~ 17byte | -1038+1 ~ +1038-1 | 고정 소수점, 실수를 정확하게 저장할때 사용 |
| NUMERIC(m, d) |
정수 자료형에 사용 가능한 예약어 2가지 SIGNED, UNSIGNED
INT 타입의 경우 32bit(4byte)의 저장 용량을 가지고 있다
하지만 실제로 31비트의 용량(범위)만을 가진다(SIGNED) 그 이유는 맨 앞에 비트는 부호를 구분하기 위해 쓰인다(양수, 음수)
이것은 MSB(Most Significant Bit) 라고 부른다고 한다(최상단의 비트) 반대는 LSB(Least Significant Bit)
숫자 2를 32bit로 저장하면 0000 / 0000 / 0000 / 0000 / 0000 / 0000 / 0000 / 0010
숫자 -2를 32bit 로 저장하면 1000 / 0000 / 0000 / 0000 / 0000 / 0000 / 0000 / 0010
SIGNED
음수와 양수 모두 표현할때 사용
저장 가능한 용량을 반반으로 나눠 각각 음수, 양수에 사용
기본 Default 값으로 SIGNED 예약어가 적용되어 있다
UNSIGNED
양수만 표현할때 사용
MSB로 부호 구분을 하지 않는다 그러므로 저장 가능한 용량을
전부 양수만 저장하므로 표현 가능한 양수가 약 2배 늘어난다
--사용 예시
CREATE TABLE example (
id INT UNSIGNED NOT NULL
);
부동 소수점(FLOAT, DOUBLE)
실수를 저장할때 사용
고정 소수점 타입에 비해 정확하지 않다
고정 소수점(DECIMAL, NUMARIC)
MySQL 에서는 DECIMAL 과 NUMARIC은 동일하다고 보면 된다DECIMAL 자료형을 사용할때 표현할 전체 자릿수(m), 표현할 소수점 자리(d)을 지정해 줘야한다ex) DECIMAL(5,2) => 111.23
문자 데이터 타입
| 데이터 타입 | 바이트 수 | 설명 | |
| CHAR(n) | 1 ~ 255byte | 고정 길이 문자형 ex)CHAR(4) => 'a ', '바나나 ' |
|
| VARCHAR(n) | 1 ~ 65535byte | 가변 길이 문자형, 저장될 문자열의 길이 만큼만 저장 | |
| TINYTEXT | 1 ~ 255byte | 255 크기의 TEXT 데이터 값 | |
| TEXT | 1 ~ 65535byte | N 크기의 TEXT 데이터 값 | |
| MEDIUMTEXT | 1 ~ 16777215byte | 16777215 크기의 TEXT 데이터 값 | |
| LONGTEXT | 1 ~ 4294967295byte | 최대 4GB 크기의 TEXT 데이터 값 | |
| BINARY(n) | 1 ~ 255byte | 고정 길이의 이진 데이터 값 | |
| VARBINARY(n) | 1 ~ 255byte | 가변 길이의 이진 데이터 값 | |
| BLOB | TINYBLOB | 1 ~ 255byte | 255 크기의 BLOB 데이터 값 |
| MEDIUMBLOB | 1 ~ 16777215byte | 16777215 크기의 BLOB 데이터 값 | |
| LONGBLOB | 1 ~ 4294967295 | 최대 4GB 크기의 BLOB 데이터 값 | |
| ENUM('value1','value2',...) | 1 또는 2byte | 최대 65535개의 열거형 데이터 값 | |
| SET( 'value1','value2',...) | 1, 2, 3, 4, 8byte | 최대 64개의 중복되지 않는 데이터 값 | |
CHAR
CHAR는 고정된 공간을 차지한다.
어떤 컬럼을 CHAR(4)으로 설정하고 'a' 라는 문자열을 저장하면 'a ' 형식으로 저장되고
남는 공간은 스페이스로 채워진다
전화번호 같이 고정적인 길이를 가지는 문자열은 CHAR 자료형을 쓰는걸 권장한다고 한다
VARCHAR
VARCHAR는 CHAR와 달리 문자열 길이 만큼의 가변적인 공간을 차지한다
CHAR vs VARCHAR
VARCHAR는 데이터를 저장할때 문자열의 길이도 포함해서 저장하기 때문에 1,2 byte 정도 용량을 추가로 차지한다
그 이유는 가변적인 길이를 저장하기에 컴퓨터가 어디까지 읽어야 하는지 알 수 없다
그래서 저장한 문자열의 총 길이값도 저장하고 데이터 연산시에도 CHAR보다 미세하게 시간을 더 소모한다
VARCHAR는 가변 길이의 데이터를 저장하지만 뒤에 (30) 처럼 길이를 정해주는 이유는
용량 조절보다 실수, 악의적으로 매우 긴 데이터 입력을 방지하기 위함이다
불필요하게 주어진 VARCHAR의 길이 값은 성능을 저하시킬 수 있다고 한다
BLOB
BLOB은 바이너리 형태의 데이터를 저장하는데 사용된다
TEXT와 달리 어떤 글자 종류인지 캐릭터셋을 갖지 않는다.
이미지 파일 등을 파일 형태로 저장하지 않고 바이너리 데이터로 저장할때 사용된다(js의 Blob객체와 비슷한거같다)
날짜 데이터 타입
| 데이터 타입 | 바이트 수 | 설명 | |
| DATE | 3byte | 1001-01-01 ~ 9999-12-31까지 저장, 'YYYY-MM-DD' 형식으로 사용됨 |
|
| TIME | 3byte | -838:59:59.000000 ~ 838:59:59.000000까지 저장, 'HH:MM:SS' 형식으로 사용 |
|
| DATETIME | 8byte | 1001-01-01 00:00:00 ~ 9999-12-31 23:59:59까지 저장, 'YYYY-MM-DD HH:MM:SS 형식으로 사용 |
|
| TIMESTAMP | 4byte | 1970-01-01 00:00:01 ~ 2038-01-19 03:14:07 까지 저장, 'YYYY-MM-DD HH:MM:SS 형식으로 사용. time_zone 시스템 변수와 관련이 있으며 UTC 시간대로 변환하여 저장. |
|
| YEAR | 1byte | 1901 ~ 2155까지 저장. 'YYYY' 형식으로 사용. | |
DATETIME
DATETIME은 날짜를 있는 그대로 저장한다
그렇기 때문에 시차와 관계없이 똑같이 읽힌다(미국 에서나 한국에서나 저장된 날짜 그대로 읽힘)
TIMESTAMP
TIMESTAMP는 숫자값을 저장한다.
이는 그리니치 평균시(GMT)로 1970년 1월 1일 자정부터, 입력되는 시간까지
총 몇 밀리세컨드가 지났는지를 UTC 시간대로 저장한다.
기타 데이터 타입
| 데이터 타입 | 바이트 수 | 설명 | |
| GEOMETRY | N/A | 공간 데이터 형식으로 선, 점 및 다각형 같은 공간 데이터 개체를 저장 ex) 위치 |
|
| JSON | 8byte | JSON 문서를 저장. MySQL 5.7.8 부터 지원 배열 타입 역시 지원 |
|
'database' 카테고리의 다른 글
| 테이블 2개 JOIN시 COUNT값이 곱셈이 된다? (0) | 2024.08.17 |
|---|---|
| 시퀄라이즈 모델들 비동기적으로 연결하기 (0) | 2024.04.13 |
| ORM 사용 후기 (0) | 2024.04.11 |
| mariadb Node 환경에서 트랜젝션과 관리 (0) | 2024.04.02 |
| SQL 문법(DDL, DML, DCL, DQL,TCL) (0) | 2024.03.01 |