MySQL 데이터 타입
숫자형
숫자형 설명 BIT(M) 0과 1로 구성된 이진값, M은 1~64 사이의 값. BOOL 0은 false, 0이 아닌 값은 true로 간주되는 논리형 데이터. (true: 1) TINYINT(M) 1바이트 정수, 부호 있는 수는 -128 ~ 127, 부호 없는 수는 0 ~ 255. SMALLINT(M) 2바이트 정수, 부호 있는 수는 -32768 ~ 32767, 부호 없는 수는 0 ~ 65535. MEDIUMINT(M) 3바이트 정수, 부호 있는 수는 -8388608 ~ 8388607, 부호 없는 수는 0 ~ 16777215. INT(M) 또는 INTEGER(M) 4바이트 정수, 부호 있는 수는 -2147483648 ~ 2147483647, 부호 없는 수는 0 ~ 4294967295. BIGINT(M) 8바이트 정수, 부호 있는 수는 -92233720036854775808 ~ 92233720036854775807, 부호 없는 수는 0 ~ 18446744073709551615. DECIMAL(M,D) 또는 NUMERIC M자리 정수(정밀도)와 D자리 소수점(스케일)으로 표현. 최대 65자리까지 표현 가능. 문자형
문자형 설명 CHAR(M) 고정 길이 문자열 저장 (M: 0 ~ 255). VARCHAR(M) 가변 길이 문자열 저장 (M: 0 ~ 65,535). TINYTEXT 1 ~ 255 길이의 가변 길이 문자열. TEXT 1 ~ 65,535 길이의 가변 길이 문자열. MEDIUMTEXT 1 ~ 16,777,215 길이의 가변 길이 문자열. LONGTEXT 1 ~ 429,496,729 길이의 가변 길이 문자열. ENUM 최대 65,535 개의 문자열 중 하나를 반환. SET 비트 연산 열거형, 문자열 값을 정수값으로 매핑하여 저장. 참고문서 : MySQL 5.7 Reference > 2-Digit YEAR(2) Limitations and Migrating to 4-Digit YEAR
CHAR(M)과VARCHAR(M)의 차이- 고정 길이 문자열 저장:
CHAR(M)은 항상 M개의 문자를 저장합니다. - 길이 범위: 0에서 255 사이의 길이를 가질 수 있습니다.
- 공간 사용: M 길이의 고정 공간을 사용합니다. 저장된 문자열이 M보다 짧으면 나머지 공간은 공백으로 채워집니다.
- 사용 사례: 길이가 일정하거나 변하지 않는 데이터에 적합합니다. 예를 들어, 성별, 국가 코드 등.
- VARCHAR(M)
- 가변 길이 문자열 저장:
VARCHAR(M)은 최대 M개의 문자를 저장할 수 있으며, 실제 저장되는 문자열의 길이에 따라 공간을 사용합니다. - 길이 범위: 0에서 65,535 사이의 길이를 가질 수 있습니다.
- 공간 사용: 실제 문자열 길이에 따라 가변적인 공간을 사용합니다. 추가적으로, 문자열 길이를 저장하기 위한 1~2바이트의 추가 공간이 필요합니다.
- 사용 사례: 길이가 예측 불가능하거나 변할 수 있는 데이터에 적합합니다. 예를 들어, 사용자 이름, 설명 텍스트 등.
차이점 요약
- 길이:
CHAR는 고정 길이,VARCHAR는 가변 길이입니다. - 공간 효율성:
CHAR는 항상 고정된 공간을 사용하지만,VARCHAR는 실제 데이터 길이에 따라 공간을 사용합니다. - 적용 사례:
CHAR는 데이터 길이가 일정한 경우에,VARCHAR는 길이가 변할 수 있는 경우에 적합합니다.
- 고정 길이 문자열 저장:
날짜형
날짜형 설명 DATE 날짜를 표현하는 타입 (3바이트), '1000-01-01' ~ '9999-12-31'. DATETIME 날짜와 시간을 같이 나타내는 타입 (8바이트), '1000-01-01 00:00:00' ~ '9999-12-31 23:59:59'. TIMESTAMP '1970-01-01 00:00:00' ~ '2037-01-19 03:14:07', INSERT, UPDATE 연산에 유리 (4바이트). TIME 시간을 표현하는 타입 (3바이트), '-838:59:59' ~ '838:59:59'. YEAR 연도를 나타냄 (1바이트), 1901 ~ 2155, 70 ~ 69 (1970 ~ 2069).
DATETIME과TIMESTAMP의 차이- 범위:
1000-01-01 00:00:00부터9999-12-31 23:59:59까지. - 저장 크기: 8바이트.
- 시간대에 무관:
DATETIME값은 시간대 변환 없이 그대로 저장됩니다. - 사용 사례: 특정 사건이 발생한 정확한 시점을 기록할 때 사용. 예를 들어, 사용자의 생일이나 기념일 등.
- TIMESTAMP*
- 범위:
1970-01-01 00:00:00부터2037-01-19 03:14:07까지. - 저장 크기: 4바이트.
- 시간대 인식:
TIMESTAMP는 UTC로 저장되며, 조회 시 서버의 시간대 설정에 따라 변환됩니다. - 자동 갱신:
INSERT나UPDATE연산 시 현재 시간으로 자동 갱신될 수 있습니다. - 사용 사례: 레코드의 생성 또는 수정 시간을 기록할 때 주로 사용. 예를 들어, 게시물의 작성 시간이나 마지막 수정 시간 등.
- 실제 사용 예시*
- DATETIME 사용 예시: 사용자 프로필
date_of_birth DATETIME: 사용자의 생일 데이터의 경우 회원 가입 이후 변경되지 않으며, 시간대에 영향을 받지 않는다.CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100), email VARCHAR(100), date_of_birth DATETIME );
- TIMESTAMP 사용 예시: 블로그 게시물
created_at TIMESTAMP: 게시물이 처음 생성된 시간. 이 필드는 게시물이 만들어질 때 현재 시간으로 자동 설정됩니다.updated_at TIMESTAMP: 게시물이 마지막으로 수정된 시간. 이 필드는 게시물이 수정될 때마다 현재 시간으로 자동 갱신됩니다.CREATE TABLE blog_posts ( id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(255), content TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );
*사용시 고려사항
- 시간대 : 국제화된 애플리케이션에서는 시간대 변환의 중요성 때문에
TIMESTAMP가 유리할 수 있습니다. - 범위와 저장 크기 :
DATETIME은 더 넓은 범위를 커버하며 더 많은 저장 공간을 사용합니다. - 자동 갱신의 필요성 : 레코드의 생성 또는 수정 시간을 자동으로 추적하고 싶다면
TIMESTAMP가 적합합니다. DATETIME* 은 시간대에 무관한 넓은 범위의 날짜와 시간을 8바이트로 저장TIMESTAMP* 는 시간대를 인식하는 좁은 범위의 날짜와 시간을 4바이트로 저장하며, 자동 갱신 기능
- 범위:
DATETIME
'Database' 카테고리의 다른 글
| Database. 2일차 - DML 기초(데이터 조회 - SELECT FROM) (0) | 2024.02.19 |
|---|---|
| Database. 2일차 - DML 기초(데이터 생성 - INSERT INTO) (0) | 2024.02.19 |
| Database. 1일차 - MySQL User 데이터 관리하기 (0) | 2024.01.24 |
| Database. 1일차 - 스키마(Schema) 구성(DDL) (0) | 2024.01.24 |
| Database. 1일차 - 스키마(Schema) 개념, SQL의 개념 (0) | 2024.01.24 |