MySQL 컬럼 타입

정수(integer)

우리는 모든 컬럼 타입을 기본적으로 지원합니다. 하지만 그렇지 않다면 **커스텀 타입**을 자유롭게 생성할 수 있습니다.

중요

이 문서의 모든 예제는 데이터베이스 컬럼 이름 별칭을 사용하지 않으며, 컬럼 이름은 TypeScript 키에서 생성됩니다.

원한다면 데이터베이스 별칭을 컬럼 이름에 사용할 수 있으며, casing 매개변수를 사용해 Drizzle의 매핑 전략을 정의할 수도 있습니다.

자세한 내용은 여기에서 확인할 수 있습니다.

부호 있는 정수로, 값의 크기에 따라 0, 1, 2, 3, 4, 6, 또는 8 바이트로 저장됩니다.

import { int, mysqlTable } from "drizzle-orm/mysql-core";

const table = mysqlTable('table', {
	int: int()
});
CREATE TABLE `table` (
	`int` int,
);

tinyint

import { tinyint, mysqlTable } from "drizzle-orm/mysql-core";

const table = mysqlTable('table', {
    tinyint: tinyint()
});
CREATE TABLE `table` (
    `tinyint` tinyint
);

smallint

import { smallint, mysqlTable } from "drizzle-orm/mysql-core";

const table = mysqlTable('table', {
	smallint: smallint()
});
CREATE TABLE `table` (
	`smallint` smallint
);

위 코드는 drizzle-orm 라이브러리를 사용하여 MySQL 데이터베이스에 smallint 타입의 컬럼을 생성하는 예제입니다.

이 코드를 실행하면, MySQL 데이터베이스에 table이라는 이름의 테이블이 생성되고, smallint 컬럼이 추가됩니다.

mediumint

import { mediumint, mysqlTable } from "drizzle-orm/mysql-core";

const table = mysqlTable('table', {
    mediumint: mediumint()
});
CREATE TABLE `table` (
    `mediumint` mediumint
);

bigint

import { bigint, mysqlTable } from "drizzle-orm/mysql-core";

const table = mysqlTable('table', {
    bigint: bigint({ mode: 'number' }),
    bigintUnsigned: bigint({ mode: 'number', unsigned: true })
});

bigint('...', { mode: 'number' | 'bigint' });

// bigint에 unsigned 옵션도 지정할 수 있습니다.
bigint('...', { mode: 'number' | 'bigint', unsigned: true });
CREATE TABLE `table` (
    `bigint` bigint,
    `bigintUnsigned` bigint unsigned,
);

bigint(M)에서 M 설정은 숫자 타입의 표시 너비를 나타내기 때문에 생략했습니다.

---

실수(real) 타입

import { real, mysqlTable } from "drizzle-orm/mysql-core";

const table = mysqlTable('table', {
    real: real()
});
CREATE TABLE `table` (
    `real` real,
);
import { real, mysqlTable } from "drizzle-orm/mysql-core";

const table = mysqlTable('table', {
    realPrecision: real({ precision: 1,}),
    realPrecisionScale: real({ precision: 1, scale: 1,}),
});
CREATE TABLE `table` (
    `realPrecision` real(1),
    `realPrecisionScale` real(1, 1),
);

decimal

import { decimal, mysqlTable } from "drizzle-orm/mysql-core";

const table = mysqlTable('table', {
    decimal: decimal()
});
CREATE TABLE `table` (
    `decimal` decimal,
);
import { decimal, mysqlTable } from "drizzle-orm/mysql-core";

const table = mysqlTable('table', {
    decimalPrecision: decimal({ precision: 1,}),
    decimalPrecisionScale: decimal({ precision: 1, scale: 1,}),
});
CREATE TABLE `table` (
    `decimalPrecision` decimal(1),
    `decimalPrecisionScale` decimal(1, 1),
);

double 타입

import { double, mysqlTable } from "drizzle-orm/mysql-core";

const table = mysqlTable('table', {
    double: double('double')
});
CREATE TABLE `table` (
    `double` double,
);
import { double, mysqlTable } from "drizzle-orm/mysql-core";

const table = mysqlTable('table', {
    doublePrecision: double({ precision: 1,}),
    doublePrecisionScale: double({ precision: 1, scale: 1,}),
});
CREATE TABLE `table` (
    `doublePrecision` double(1),
    `doublePrecisionScale` double(1, 1),
);

위 예제는 double 타입을 사용하여 MySQL 테이블을 생성하는 방법을 보여줍니다. 첫 번째 예제는 기본 double 타입을 정의하고, 두 번째 예제는 정밀도(precision)와 스케일(scale)을 지정하여 double 타입을 정의합니다.

float

import { float, mysqlTable } from "drizzle-orm/mysql-core";

const table = mysqlTable('table', {
	float: float()
});
CREATE TABLE `table` (
	`float` float,
);

위 코드는 Drizzle ORM을 사용하여 MySQL 데이터베이스에 float 타입의 컬럼을 생성하는 예제입니다.

SQL 문법으로는 CREATE TABLE을 사용하여 동일한 구조의 테이블을 생성할 수 있습니다. float 컬럼은 MySQL에서 부동소수점 숫자를 저장하는 데 적합합니다.

---

SERIAL

SERIALBIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE의 별칭입니다.

import { serial, mysqlTable } from "drizzle-orm/mysql-core";

const table = mysqlTable('table', {
	serial: serial()
});
CREATE TABLE `table` (
	`serial` serial AUTO_INCREMENT,
);

---

바이너리(Binary)

import { binary, mysqlTable } from "drizzle-orm/mysql-core";

const table = mysqlTable('table', {
	binary: binary()
});
CREATE TABLE `table` (
	`binary` binary,
);

위 예제는 drizzle-orm 라이브러리를 사용하여 MySQL 테이블을 정의하는 방법을 보여줍니다. binary 타입은 바이너리 데이터를 저장하는 데 사용됩니다. 이 타입은 데이터베이스에서 바이너리 데이터를 처리할 때 유용합니다.

varbinary

import { varbinary, mysqlTable } from "drizzle-orm/mysql-core";

const table = mysqlTable('table', {
    varbinary: varbinary({ length: 2 }),
});
CREATE TABLE `table` (
    `varbinary` varbinary(2),
);

---

char 타입

import { char, mysqlTable } from "drizzle-orm/mysql-core";

const table = mysqlTable('table', {
    char: char(),
});
CREATE TABLE `table` (
    `char` char,
);

위 코드는 drizzle-orm 라이브러리를 사용하여 MySQL 테이블을 정의하는 예제입니다. char 타입은 고정 길이 문자열을 저장하는 데 사용됩니다. 이 타입은 지정된 길이만큼의 공간을 항상 차지하며, 저장된 문자열이 그 길이보다 짧을 경우 나머지 공간은 공백으로 채워집니다.

mysqlTable 함수는 테이블을 정의하고, char 함수는 char 타입의 컬럼을 생성합니다. 이렇게 정의된 테이블은 SQL 쿼리로 생성될 때 동일한 구조를 가집니다.

varchar 타입

{ enum: ["value1", "value2"] } 설정을 통해 insertselect 타입을 추론할 수 있습니다. 하지만 이 설정은 런타임 값을 검사하지 않습니다.

import { varchar, mysqlTable } from "drizzle-orm/mysql-core";

const table = mysqlTable('table', {
    varchar: varchar({ length: 2 }),
});

// "value1" | "value2" | null 타입으로 추론됨
varchar: varchar({ length: 6, enum: ["value1", "value2"] })
CREATE TABLE `table` (
    `varchar` varchar(2),
);

텍스트

{ enum: ["value1", "value2"] } 설정을 정의하여 insertselect 타입을 추론할 수 있습니다. 하지만 이 설정은 런타임 값을 검사하지 않습니다.

import { text, mysqlTable } from "drizzle-orm/mysql-core";

const table = mysqlTable('table', {
	text: text(),
});

// text는 "value1" | "value2" | null로 추론됩니다.
text: text({ enum: ["value1", "value2"] });
CREATE TABLE `table` (
	`text` text,
);

---

불리언(Boolean)

import { boolean, mysqlTable } from "drizzle-orm/mysql-core";

const table = mysqlTable('table', {
	boolean: boolean(),
});
CREATE TABLE `table` (
	`boolean` boolean,
);

위 예제는 drizzle-orm/mysql-core 모듈을 사용하여 MySQL 테이블을 정의하는 방법을 보여줍니다. boolean 타입의 컬럼을 생성하는 방법을 확인할 수 있습니다. 이 컬럼은 true 또는 false 값을 저장할 수 있습니다.

---

날짜

import { boolean, mysqlTable } from "drizzle-orm/mysql-core";

const table = mysqlTable('table', {
    date: date(),
});
CREATE TABLE `table` (
    `date` date,
);

datetime

import { datetime, mysqlTable } from "drizzle-orm/mysql-core";

const table = mysqlTable('table', {
	datetime: datetime(),
});

datetime('...', { mode: 'date' | "string"}),
datetime('...', { fsp : 0..6}),
CREATE TABLE `table` (
	`datetime` datetime,
);
import { datetime, mysqlTable } from "drizzle-orm/mysql-core";

const table = mysqlTable('table', {
	datetime: datetime({ mode: 'date', fsp: 6 }),
});
CREATE TABLE `table` (
	`datetime` datetime(6),
);

시간(time)

import { time, mysqlTable } from "drizzle-orm/mysql-core";

const table = mysqlTable('table', {
    time: time(),
    timefsp: time({ fsp: 6 }),
});

time('...', { fsp: 0..6 }),
CREATE TABLE `table` (
    `time` time,
    `timefsp` time(6),
);

위 코드는 MySQL 데이터베이스에서 시간(time) 타입을 다루는 예제입니다. drizzle-orm 라이브러리를 사용하여 테이블을 정의하고, 시간 필드를 생성합니다.

이렇게 하면 데이터베이스에서 정밀한 시간 데이터를 저장하고 관리할 수 있습니다.

year 타입

import { year, mysqlTable } from "drizzle-orm/mysql-core";

const table = mysqlTable('table', {
	year: year(),
});
CREATE TABLE `table` (
	`year` year,
);

위 예제는 MySQL 데이터베이스에서 year 타입을 사용하는 방법을 보여줍니다. drizzle-orm 라이브러리를 사용하여 테이블을 정의할 때 year 타입을 지정할 수 있습니다. 이 타입은 연도 데이터를 저장하는 데 적합합니다.

이 방식은 데이터베이스 스키마를 코드로 관리할 때 유용하며, 타입 안정성을 보장합니다.

타임스탬프

import { timestamp, mysqlTable } from "drizzle-orm/mysql-core";

const table = mysqlTable('table', {
    timestamp: timestamp(),
});

timestamp('...', { mode: 'date' | "string"}),
timestamp('...', { fsp : 0..6}),
CREATE TABLE `table` (
    `timestamp` timestamp,
);
import { timestamp, mysqlTable } from "drizzle-orm/mysql-core";

const table = mysqlTable('table', {
    timestamp: timestamp({ mode: 'date', fsp: 6 }),
});
CREATE TABLE `table` (
    `timestamp` timestamp(6),
);
import { timestamp, mysqlTable } from "drizzle-orm/mysql-core";

const table = mysqlTable('table', {
    timestamp: timestamp().defaultNow(),
});
CREATE TABLE `table` (
    `timestamp` timestamp DEFAULT (now()),
);

---

JSON 타입 사용하기

import { json, mysqlTable } from "drizzle-orm/mysql-core";

const table = mysqlTable('table', {
    json: json(),
});
CREATE TABLE `table` (
    `json` json,
);

JSON 객체의 타입 추론을 위해 .$type<..>()를 지정할 수 있습니다. 이는 런타임 값을 검사하지 않습니다.
기본값, 삽입 및 선택 스키마에 대해 컴파일 타임 보호 기능을 제공합니다.

// { foo: string } 타입으로 추론됨
json: json().$type<{ foo: string }>();

// string[] 타입으로 추론됨
json: json().$type<string[]>();

// 컴파일 오류 발생 (기본값이 타입과 일치하지 않음)
json: json().$type<{ foo: string }>().default({});

---

enum (열거형)

import { mysqlEnum, mysqlTable } from "drizzle-orm/mysql-core";

const table = mysqlTable('table', {
    mysqlEnum: mysqlEnum(['unknown', 'known', 'popular']),
});
CREATE TABLE `table` (
    `popularity` enum('unknown','known','popular'),
);

위 코드는 TypeScript와 SQL을 사용하여 MySQL 테이블을 정의하는 예제입니다. mysqlEnum 함수를 사용해 unknown, known, popular 세 가지 값을 가진 열거형(enum) 타입의 컬럼을 생성합니다. 이 열거형은 데이터베이스에서 특정 값만 허용하도록 제한하는 데 유용합니다.

TypeScript 코드에서는 mysqlTable 함수를 사용해 테이블을 정의하고, mysqlEnum 함수로 열거형 컬럼을 추가합니다. SQL 코드에서는 enum 키워드를 사용해 동일한 열거형 컬럼을 생성합니다.

---

데이터 타입 커스터마이징

모든 컬럼 빌더는 .$type() 메서드를 제공합니다. 이 메서드를 사용하면 컬럼의 데이터 타입을 커스터마이징할 수 있습니다. 이 기능은 알려지지 않은 타입이나 브랜드 타입을 다룰 때 유용합니다.

type UserId = number & { __brand: 'user_id' };
type Data = {
	foo: string;
	bar: number;
};

const users = mysqlTable('users', {
  id: int().$type<UserId>().primaryKey(),
  jsonField: json().$type<Data>(),
});

위 예제에서 id 컬럼은 UserId 타입으로, jsonField 컬럼은 Data 타입으로 커스터마이징되었습니다. 이를 통해 특정 타입을 명시적으로 지정할 수 있습니다.

NOT NULL 제약 조건

NOT NULL 제약 조건은 해당 컬럼이 NULL 값을 포함할 수 없음을 의미합니다.

import { int, mysqlTable } from "drizzle-orm/mysql-core";

const table = mysqlTable('table', {
    int: int().notNull(),
});
CREATE TABLE `table` (
    `int` int NOT NULL,
);

기본값 설정

DEFAULT 절은 사용자가 INSERT를 수행할 때 명시적으로 값을 제공하지 않았을 경우, 컬럼에 사용할 기본값을 지정합니다. 컬럼 정의에 명시적인 DEFAULT 절이 없으면, 컬럼의 기본값은 NULL이 됩니다.

명시적인 DEFAULT 절은 기본값을 NULL, 문자열 상수, 블롭 상수, 부호 있는 숫자, 또는 괄호로 둘러싸인 상수 표현식으로 지정할 수 있습니다.

import { int, mysqlTable } from "drizzle-orm/mysql-core";

const table = mysqlTable('table', {
	int: int().default(3),
});
CREATE TABLE `table` (
	`int` int DEFAULT 3,
);

$default() 또는 $defaultFn()을 사용하면 런타임에 기본값을 생성하고, 이 값을 모든 삽입 쿼리에서 사용할 수 있습니다. 이 함수들은 uuid, cuid, cuid2 등 다양한 구현을 활용하는 데 도움을 줄 수 있습니다.

참고: 이 값은 drizzle-kit 동작에 영향을 미치지 않으며, drizzle-orm에서만 런타임에 사용됩니다.

import { varchar, mysqlTable } from "drizzle-orm/mysql-core";
import { createId } from '@paralleldrive/cuid2';

const table = mysqlTable('table', {
	id: varchar({ length: 128 }).$defaultFn(() => createId()),
});

$onUpdate() 또는 $onUpdateFn()을 사용하면 런타임에 기본값을 생성하고, 이 값을 모든 업데이트 쿼리에서 사용할 수 있습니다. 이 함수는 행이 업데이트될 때 호출되며, 반환된 값이 컬럼 값으로 사용됩니다. 만약 기본값(또는 $defaultFn)이 제공되지 않으면, 행이 삽입될 때도 이 함수가 호출되고 반환된 값이 컬럼 값으로 사용됩니다.

참고: 이 값은 drizzle-kit 동작에 영향을 미치지 않으며, drizzle-orm에서만 런타임에 사용됩니다.

import { text, mysqlTable } from "drizzle-orm/mysql-core";

const table = mysqlTable('table', {
    alwaysNull: text().$type().$onUpdate(() => null),
});

기본 키(Primary Key)

import { int, mysqlTable } from "drizzle-orm/mysql-core";

const table = mysqlTable('table', {
    int: int().primaryKey(),
});
CREATE TABLE `table` (
    `int` int PRIMARY KEY NOT NULL,
);

위 예제는 Drizzle ORM과 SQL을 사용하여 기본 키를 정의하는 방법을 보여줍니다. int 컬럼을 기본 키로 설정했으며, 이 컬럼은 NULL 값을 허용하지 않습니다.

자동 증가(Auto Increment)

import { int, mysqlTable } from "drizzle-orm/mysql-core";

const table = mysqlTable('table', {
    int: int().autoincrement(),
});
CREATE TABLE `table` (
    `int` int AUTO_INCREMENT
);

위 예제는 데이터베이스 테이블에서 자동으로 증가하는 값을 설정하는 방법을 보여줍니다. drizzle-orm 라이브러리를 사용하여 TypeScript에서 테이블을 정의할 때, int().autoincrement()를 사용하면 해당 컬럼이 자동 증가 값으로 설정됩니다. 이는 SQL에서 AUTO_INCREMENT 키워드를 사용하는 것과 동일한 효과를 가집니다.