http://www.tcpschool.com/mysql/mysql_datatype_numeric
지난 기본 문법 포스팅을 하면서 테이블을 생성할 때 컬럼명과 함께 컬럼별로 타입도 함께 명시해주었다.
이번에는 그 타입을 정리해보자!
MySQL에서 제공하는 기본타입에는 3가지가 있다.
- 숫자 타입
- 문자열 타입
- 날짜와 시간타입
숫자타입
타입 | 정의 | 범위 | UNSIGNED 사용가능 여부 |
TINYINT(n) | 정수형 데이터 타입 | - 1 Byte(2^8) - 128 ~ + 127 또는 0 ~ 255 수 표현 가능 - 1Byte(2^8) - 128 ~ + 127 또는 0 ~ 255 수 표현 가능 |
O |
SMALLINT(n) | 정수형 데이터 타입 | - 2 Byte(2^16) - 32,768 ~ 32,167 또는 0 ~ 65536수 표현 가능 |
O |
MEDIUMINT(n) | 정수형 데이터 타입 | - 3 Byte - 8,388,608 ~ 8,388,607 또는 0 ~ 16,777,215 수 표현 가능 |
O |
INT(n) | 정수형 데이터 타입 | - 4 Byte - 2,147,483,648 ~ 2,147,483,647 또는 0 ~ 4,294,967,295 수 표현 가능 |
O |
BIGINT(n) | 정수형 데이터 타입(LONG) | - 8 byte - 2^64 - 1 표현 가능 (무한 수 표현 가능이라고도 함) |
O |
DECIMAL(m, d) | - 고정 소수형 데이터 타입고정(길이+1 byte) - M의 최대값은 65, D는 소수 자릿수이며 0이면 소수점 가지지 않음 |
- 소수점을 사용한 형태 - Default: m ⇒ 10 |
X |
FLOAT(n) | 부동 소수형 데이터 타입 | - 4 byte - 부동 소수점을 사용한 형태 |
X |
DOUBLE(n) | 부동 소수형 데이터 타입 | - 8 byte - DOUBLE을 문자열로 저장 |
X |
- 정수타입(integer types)
각 정수 타입에 따라 저장 공간과 표현할 수 있는 최대값, 최소값이 다르다.
또, 정수 타입은 음수까지 표현할 수 있는 SIGNED 타입과 양수만을 표현할 수 있는 UNSIGNED 타입으로 구분된다.
해당 타입에 UNSIGNED 속성을 부여하면 음수값을 대입할 수 없게 된다.
- 고정 소수점 타입(fixed-point types), 부동 소수점 타입(floating-point types)
정확한 실수를 표현하기 위해 사용하는 고정 소수점 타입에는 DECIMAL이 있는데, 이건 SQL의 NUMERIC 타입을 구현해서 만들어졌다고 한다.
즉, DECIMAL대신 NUMERIC을 사용해도 똑같이 작동한다.
DECIMAL(M,D)
이런 형태로 생긴 DECIMAL은 M에 실수를 포함한 총 자리수, D에는 소수부분의 자리수를 나타내며
M의 최대값은 65이고, D가 0이면 소수자리를 갖지 않는다.
예를 들어,
DECIMAL(7,2)
이 예시는 -99999.99 ~ 99999.99 만큼 표현이 가능하다.
총 7개의 숫자 중에 2개는 소수로 나타낸다고 이해하면 헷갈리지 않을 것 같다.
대략적인 실수를 표현하기 위해 사용되는 부동 소수점 타입에는 FLOAT
와 DOUBLE
이 있다.
FLOAT는 4바이트를 사용하며, DOUBLE은 8바이트를 사용하며, 다음과 같이 사용한다
FLOAT(P)
DOUBLE(P)
여기서 P가 0부터 24까지의 값을 가질 때는 FLOAT 값으로 취급되며, 25부터 53까지의 값을 가질 때는 DOUBLE 값으로 취급된다.
DECIAML과 같이 (M, D) 형식으로도 사용할 수 있다고 한다!
+
고정 소수점은 고정된 소수라는 건 알았지만 부동소수점을 不動(아니 부, 움직일 동)이라고 생각해서 왜 floating 번역을 해놨지라는 생각을 했었는데 알고보니 浮動(뜰 부, 움직일 동)라고 한다...
고정 소수점과 부동 소수점의 차이는 값을 '정확하게' 표현하느냐, '대략적'으로 표현하느냐인데
그냥 봐서는 이해하기 어려우니 예시와 함께 알아보자
다음과 같이 저장되어있는 테이블이 있다.
위 테이블의 값을 연산해보면
SELECT SUM(num1) deciaml_type, SUM(num2) float_type FROM study;
DECIMAL 타입은 정해진 자리수로 떨어지지지만, FLOAT 타입의 경우 의도치 않은 결과를 반환하는 것을 볼 수 있다.
그렇기 때문에 DECIAML은 화폐 데이터와 같이 정확한 데이터를 요할 경우 주로 사용하고, FLOAT나 DOUBLE은 대략적인 근삿값을 필요로 할 때 사용한다고 한다.
문자열 타입
타입 | 정의 | 길이 |
CHAR(n) | - 고정 길이 데이터 타입 - 지정된 길이보다 짧은 데이터 입력 시 나머지 길이는 공백으로 채워짐 - 검색시, PAD_CHAR_TO_FULL_LENGTH 모드를 설정하지 않으면 공백은 제거됨 |
0 ~ 255 (byte) |
VACHAR(n) | - 가변 길이 데이터 타입 - 지정된 길이보다 짧은 데이터 입력시 공백으로 채우지 않음 |
0 ~ 65,535 (byte) |
TINYTEXT(n) | - 문자열 데이터 타입(최대 255 byte) - TINYBLOB와 같은 길이값을 저장 가능(단 차이점은 저장 될때 nonbinary string으로 저장) |
0 ~ 255 (byte) |
TEXT(n) | - 문자열 데이터 타입(최대 65,535 byte) - BLOB와 같은 길이값을 저장 가능(단 차이점은 저장 될때 nonbinary string으로 저장) |
0 ~ 65,535 (byte) |
MEDIUMTEXT(n) | - 문자열 데이터 타입(최대 16,777,215 byte) - MEDIRMBLOB와 같은 길이값을 저장 가능(단 차이점은 저장 될때 nonbinary string으로 저장) |
0 ~ 16,777,215 (byte) |
LONGTEXT(n) | - 문자열 데이터 타입(최대 4,294,967,295 byte) - LONGBLOB와 같은 길이값을 저장 가능(단 차이점은 저장 될때 nonbinary string으로 저장) |
0 ~ 4,294,967,295 (byte) |
- CHAR와 VARCHAR
CHAR와 VARCHAR는 둘다 문자열을 저장하는 타입이지만 차이가 있다.
CHAR는 고정형 데이터타입으로, 한번 길이를 지정하면 그만큼의 공간을 할당한다.
VARCHAR는 가변형 데이터타입으로, 길이를 지정해놓더라도 필요한 만큼의 공간만 사용한다. 길이를 지정하는 건 최대값을 지정하는 것과 같은 의미라고 생각하면 될 것 같다.
MySQL 메뉴얼에 한눈에 보기 쉬운 예제가 있어서 가져와보았다.
(출처) char와 varchar
그림과 같이 CHAR에 4개의 공간을 할당했다고 하면 그 안에 문자를 1개를 넣든 2개를 넣던 여전히 4개의 공간을 가지고 있는 반면
VARCHAR에 4개의 공간을 할당했을 때 그 안에 문자를 1개를 넣으면 1개의 공간만 사용하기 때문에 저장공간을 절약할 수 있다.
그럼 각각의 타입은 어떤 때에 사용해야할까?
CHAR는 아주 짧은 문자열을 저장하고자 할 때나 모든 값이 거의 같은 길이일 때 유용하다. 또, 고정 길이의 행은 단편화가 거의 발생하지 않기때문에 자주 바뀌는 데이터를 저장할 때에는 CHAR가 VARCHAR보다 유리하다.
VARCHAR는 보통 컬럼의 최대 길이가 평균 길이보다 훨씬 클 때나 필드가 업데이트되는 일이 드물어서 단편화가 문제되지 않을 때 혹은 UTF-8 처럼 문자마다 사용하는 바이트 수가 다른 복잡한 문자 셋을 사용할 때 유용하다.
단편화?
간단히 말하면 데이터를 작게 쪼개는 것이라고 한다.
(참고) http://www.ktword.co.kr/test/view/view.php?m_temp1=393
- BLOB과 TEXT
BLOB은 다양한 크기의 바이너리 데이터를 저장할 수 있는 타입이고, TEXT는 문자열을 저장할 수 있는 타입이다.
TEXT와 BLOB은 비슷하지만, BLOB과 달리 문자열의 대소문자를 구분하며
VARCHAR와도 비슷하지만, VARCHAR와 달리 기본값을 지정할 수 없다는 차이가 있다.
TEXT와 BLOB 모두 저장할 수 있는 데이터 크기에 따라 TINYTEXT(BLOB), TEXT(BLOB), MEDIUMTEXT(BLOB), LONGTEXT(BLOB)으로 구분된다.
날짜와 시간 타입
- DATE, DATETIME, TIMESTAMP
타입 | 정의 | 저장 범위 |
DATE | 날짜(년, 월, 일) 형태의 기간 표현 데이터 타입 (3byte) | 1000-01-01 ~ 9999-12-31 |
DATETIME | 날짜와 시간 형태의 기간 표현 데이터 타입 (8byte) | 1000-01-01 00:00:00 ~ 9999-12-31 23:90:90 |
TIMESTAMP | 날짜와 시간 형태의 기간 표현 데이터 타입 (4byte) 사용자가 입력을 주지 않으면 마지막으로 입력되거나 변경된 시간 저장 |
1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC |
- TIME
타입 | 정의 | 저장범위 |
TIME | 시간(시, 분, 초) 형태의 기간 표현 데이터 타입(3byte) | -838:59:59 ~ 838:59:59 |
- YEAR
타입 | 정의 | 저장범위 |
YEAR(2) | 2자리 연도 표현 데이터 타입 (1byte) | 숫자 0 저장: 0000년 문자열 '0' 저장: 2000년 1 ~ 69 저장 : 2001년 ~ 2069년 70 ~ 99 저장 : 1970년 ~ 1999년 |
YEAR(4) | 4자리 연도 표현 데이터 타입 (1byte) | 1901년 ~ 2155년 |
YEAR(2)는 MySQL 5.7.5 버전부터 지원하지 않으므로 YEAR(4)를 사용하는 것이 좋다고 한다.
MySQL 데이터타입 한눈에 보기
https://developerking.tistory.com/6
<참고>
'Study > Database' 카테고리의 다른 글
[MySQL] 제약 조건 (0) | 2022.03.02 |
---|---|
[MySQL] 연산자와 함수 (0) | 2022.03.01 |
[MySQL] MySQL문법: 2 (0) | 2022.02.27 |
[MySQL] MySQL 문법: 1 (0) | 2022.02.20 |
[MySQL] MySQL : 시작하기 (0) | 2022.02.14 |