Database

Database. 1일차 - MySQL 데이터 타입

머용? 2024. 1. 24. 19:05

MySQL 데이터 타입

  1. 숫자형

    숫자형 설명
    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자리까지 표현 가능.
  2. 문자형

    문자형 설명
    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는 길이가 변할 수 있는 경우에 적합합니다.
  1. 날짜형

    날짜형 설명
    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).
  • DATETIMETIMESTAMP 의 차이

    • 범위: 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로 저장되며, 조회 시 서버의 시간대 설정에 따라 변환됩니다.
    • 자동 갱신: INSERTUPDATE 연산 시 현재 시간으로 자동 갱신될 수 있습니다.
    • 사용 사례: 레코드의 생성 또는 수정 시간을 기록할 때 주로 사용. 예를 들어, 게시물의 작성 시간이나 마지막 수정 시간 등.
    • 실제 사용 예시*
    1. DATETIME 사용 예시: 사용자 프로필
      • date_of_birth DATETIME: 사용자의 생일 데이터의 경우 회원 가입 이후 변경되지 않으며, 시간대에 영향을 받지 않는다.
      • CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100), email VARCHAR(100), date_of_birth DATETIME );
    2. 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