Skip to content

Commit a2eccd9

Browse files
committed
250923-mysql-data-type
1 parent 31b6867 commit a2eccd9

File tree

1 file changed

+234
-0
lines changed
  • content/blog/250923-mysql-data-type

1 file changed

+234
-0
lines changed
Lines changed: 234 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,234 @@
1+
---
2+
title: "MySQL 데이터 타입"
3+
description: "MySQL의 데이터 타입은 어떤것들이 있는지 기록"
4+
date: "2025-09-23T13:12:24"
5+
thumbnail: "./thumbnail.png"
6+
category: "Database"
7+
tags: ["SQL", "MySQL"]
8+
---
9+
10+
# MySQL 데이터 타입
11+
12+
`MySQL` 에는 다음과 같은 데이터 타입이 있습니다.
13+
14+
| 데이터 타입 | 설명 |
15+
| ----------- | ---------------- |
16+
| CHAR | 고정 길이 문자열 |
17+
| VARCHAR | 가변 길이 문자열 |
18+
| ENUM | 열거형 |
19+
| SET | 집합 |
20+
| TEXT | 텍스트 |
21+
| BLOB | 바이너리 데이터 |
22+
| DATE | 날짜 |
23+
| INT | 정수 |
24+
| BOOLEAN | 불리언 |
25+
| DECIMAL | 고정 소수점 |
26+
| FLOAT | 부동소수점 |
27+
| TIMESTAMP | 날짜와 시간 |
28+
| DATETIME | 날짜와 시간 |
29+
30+
## CHAR
31+
32+
`CHAR` 는 고정 길이 문자열을 저장하는 데이터 타입입니다.
33+
최대 255자까지 저장할 수 있습니다.
34+
35+
```sql
36+
CREATE TABLE movies (
37+
title CHAR(10)
38+
);
39+
```
40+
41+
`title` 이 만약 10글자보다 적은 경우에는 공백으로 빈자리를 채웁니다.
42+
43+
## VARCHAR
44+
45+
VARCHAR는 가변 길이 문자열을 저장하는 데이터 타입입니다.
46+
47+
```sql
48+
CREATE TABLE movies (
49+
contents VARCHAR(100)
50+
);
51+
```
52+
53+
`CHAR` 와 다르게 `contents` 가 100글자보다 적은 경우에는 빈 공간을 공백으로 채우지 않고, `contents` 의 길이만큼만 저장합니다.
54+
55+
## ENUM
56+
57+
`ENUM` 은 열거형을 저장하는 데이터 타입입니다.
58+
59+
```sql
60+
CREATE TABLE movies (
61+
rating ENUM('G', 'PG', 'R')
62+
);
63+
```
64+
65+
`rating``G`, `PG`, `R` 중 <span style="color:orange">**하나의 값**</span>만 저장할 수 있습니다.
66+
67+
## SET
68+
69+
`MySQL``SET` 데이터타입은 미리 정의된 값들의 집합에서 0개 이상의 값을 선택할 수 있는 문자열 객체입니다.
70+
71+
`SET``ENUM` 과 유사하지만, `ENUM`이 하나의 값만 선택할 수 있는 반면 `SET` 은 여러 개의 값을 동시에 선택할 수 있습니다. 내부적으로는 비트마스크를 사용하여 각 값을 저장합니다.
72+
73+
```sql
74+
CREATE TABLE user_interests (
75+
hobbies SET('reading', 'sports', 'music', 'travel', 'cooking')
76+
);
77+
```
78+
79+
`hobbies``reading`, `sports`, `music`, `travel`, `cooking` 중 하나 또는 여러 개의 값을 저장할 수 있습니다.
80+
81+
## TEXT
82+
83+
`TEXT` 는 텍스트를 저장하는 데이터 타입입니다.
84+
85+
`TEXT` 타입은 또 종류가 나뉩니다. 아래와 같이 총 4가지가 있습니다.
86+
87+
| 데이터 타입 | 설명 |
88+
| ----------- | -------------------- |
89+
| TINYTEXT | 최대 255자 |
90+
| TEXT | 최대 65,535자 |
91+
| MEDIUMTEXT | 최대 16,777,215자 |
92+
| LONGTEXT | 최대 4,294,967,295자 |
93+
94+
근데 위 종류를 보면 그냥 LONGTEXT를 사용하면 되지 않나? 라는 의문이 들 수 있습니다.
95+
96+
그러나 데이터베이스가 처리하는 방식의 차이때문에 (성능과 관련) 최대한 용도에 맞는 타입 설정이 중요합니다.
97+
98+
## BLOB
99+
100+
`BLOB (Binary Large Object)` 데이터타입은 이진 데이터를 저장하기 위한 데이터타입입니다.
101+
102+
MySQL은 크기에 따라 4가지 BLOB 타입을 제공합니다.
103+
104+
| 데이터 타입 | 최대 길이 |
105+
| ----------- | ------------------------- |
106+
| TINYBLOB | 255 bytes |
107+
| BLOB | 65,535 bytes (64KB) |
108+
| MEDIUMBLOB | 16,777,215 bytes (16MB) |
109+
| LONGBLOB | 4,294,967,295 bytes (4GB) |
110+
111+
## INT
112+
113+
`INT` 는 정수를 저장하는 데이터 타입입니다.
114+
115+
크기에 따라 5가지 정수형 타입을 제공합니다.
116+
117+
| 데이터 타입 | 바이트 | 범위(SIGNED) | 범위(UNSIGNED) |
118+
| ----------- | ------ | ------------------------------------------------------ | ------------------------------ |
119+
| TINYINT | 1 | -128 ~ 127 | 0 ~ 255 |
120+
| SMALLINT | 2 | -32,768 ~ 32,767 | 0 ~ 65,535 |
121+
| MEDIUMINT | 3 | -8,388,608 ~ 8,388,607 | 0 ~ 16,777,215 |
122+
| INT | 4 | -2,147,483,648 ~ 2,147,483,647 | 0 ~ 4,294,967,295 |
123+
| BIGINT | 8 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 0 ~ 18,446,744,073,709,551,615 |
124+
125+
```sql
126+
column_name INT
127+
128+
column_name INT UNSIGNED
129+
```
130+
131+
기본적으로 위와 같이 사용하는데, 기본값은 SIGNED 입니다.
132+
133+
## BOOLEAN
134+
135+
MySQL에서 BOOLEAN은 실제로는 TINYINT(1)의 별칭입니다.
136+
137+
진정한 불린 타입이 아닌 정수 타입으로 구현되어 있습니다.
138+
139+
TRUE, FALSE 대신 1, 0을 사용합니다.
140+
141+
```sql
142+
-- 모두 동일한 의미
143+
column_name BOOLEAN
144+
column_name BOOL
145+
column_name TINYINT(1)
146+
```
147+
148+
## DECIMAL
149+
150+
`DECIMAL` 은 고정소수점(Fixed-Point) 숫자를 정확하게 저장하는 데이터타입입니다.
151+
152+
부동소수점과 달리 정확한 계산이 가능하여 금융 데이터나 정밀한 수치 계산에 필수적입니다.
153+
154+
```sql
155+
-- 다양한 DECIMAL 정의
156+
CREATE TABLE decimal_examples (
157+
id INT PRIMARY KEY,
158+
price DECIMAL(10,2), -- 99999999.99까지 (총 10자리, 소수점 2자리)
159+
percentage DECIMAL(5,4), -- 9.9999까지 (총 5자리, 소수점 4자리)
160+
huge_number DECIMAL(65,30), -- 최대 크기
161+
simple_decimal DECIMAL -- DECIMAL(10,0)과 동일
162+
);
163+
```
164+
165+
## FLOAT
166+
167+
FLOAT는 부동소수점(Floating-Point) 숫자를 저장하는 데이터타입입니다.
168+
169+
IEEE 754 표준을 따르며, 매우 큰 범위의 수를 근사치로 저장할 수 있지만 정확도에 제한이 있습니다.
170+
171+
```sql
172+
-- 단정밀도 부동소수점
173+
FLOAT -- 4바이트, 약 7자리 정밀도
174+
FLOAT(p) -- p는 정밀도 (0-24: FLOAT, 25-53: DOUBLE)
175+
176+
-- 배정밀도 부동소수점
177+
DOUBLE -- 8바이트, 약 15자리 정밀도
178+
DOUBLE PRECISION -- DOUBLE과 동일
179+
REAL -- DOUBLE의 별칭 (sql_mode에 따라 FLOAT일 수도 있음)
180+
```
181+
182+
| 데이터 타입 | 바이트 | 범위 | 정밀도 |
183+
| ----------- | ------ | --------------------------------------------------- | --------- |
184+
| FLOAT | 4 | ±1.175494351E-38 ~ ±3.402823466E+38 | 약 7자리 |
185+
| DOUBLE | 8 | ±2.2250738585072014E-308 ~ ±1.7976931348623157E+308 | 약 15자리 |
186+
187+
## TIMESTAMP, DATETIME
188+
189+
`TIMESTAMP``DATETIME` 은 날짜와 시간을 저장하는 데이터 타입입니다.
190+
191+
| 특성 | TIMESTAMP | DATETIME |
192+
| ------------- | --------------------------------------------- | ----------------------------------------- |
193+
| 저장 공간 | 4바이트 | 8바이트 |
194+
| 범위 | 1970-01-01 00:00:01 ~ 2038-01-19 03:14:07 UTC | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 |
195+
| 시간대 처리 | UTC로 저장, 조회시 변환 | 입력값 그대로 저장 |
196+
| 자동 업데이트 | 지원 | 지원 (MySQL 5.6+) |
197+
198+
```sql
199+
-- TIMESTAMP 선언
200+
column_name TIMESTAMP [DEFAULT value] [ON UPDATE CURRENT_TIMESTAMP]
201+
202+
-- DATETIME 선언
203+
column_name DATETIME [DEFAULT value] [ON UPDATE CURRENT_TIMESTAMP]
204+
205+
-- 마이크로초 지원 (MySQL 5.6+)
206+
column_name TIMESTAMP(6) -- 마이크로초까지
207+
column_name DATETIME(3) -- 밀리초까지
208+
209+
```
210+
211+
그럼 각각을 언제 써야하나요?
212+
213+
- DATETIME : 1000년부터 9999년 사이의 날짜를 저장하고 싶으면 사용
214+
- TIMESTAMP : 시스템 이벤트 저장 시 사용하기 적절 (타임존 고려, 저장공간도 DATETIME에 비하여 덜 차지)
215+
216+
외에도 DATE, TIME, YEAR 도 있습니다.
217+
218+
### DATE, TIME, YEAR
219+
220+
- DATE : 날짜를 저장하고 싶으면 사용
221+
- TIME : 시간을 저장하고 싶으면 사용
222+
- YEAR : 년도를 저장하고 싶으면 사용
223+
224+
```sql
225+
column_name DATE
226+
column_name TIME
227+
column_name YEAR
228+
```
229+
230+
<hr/>
231+
232+
외에도 JSON, GEOMETRY, ENUM, SET 등 다양한 데이터 타입이 있습니다.
233+
234+
자세한 내용은 [MySQL 공식 문서](https://dev.mysql.com/doc/refman/8.0/en/data-types.html)를 참고해주세요.

0 commit comments

Comments
 (0)