MSSQL 列类型

npm
yarn
pnpm
bun
npm i drizzle-orm@rc
npm i drizzle-kit@rc -D

我们为它们全部提供了原生支持,不过如果这还不够用,你也可以随时创建 自定义类型

重要

本文档这一部分中的所有示例都不使用数据库列名别名,列名是根据 TypeScript 键生成的。

如果你愿意,可以在列名中使用数据库别名,也可以使用 casing API 为 Drizzle 定义映射策略。

你可以在 这里 阅读更多相关内容

int

有符号 4 字节整数

import { int, mssqlTable } from "drizzle-orm/mssql-core";

export const table = mssqlTable('table', {
	int: int()
});
CREATE TABLE [table] (
	[int] int
);
import { int, mssqlTable } from "drizzle-orm/mssql-core";

export const table = mssqlTable('table', {
	int1: int().default(10),
});
CREATE TABLE [table] (
	[int1] int CONSTRAINT [table_int1_default] DEFAULT ((10))
);

smallint

smallint

小范围有符号 2 字节整数

import { smallint, mssqlTable } from "drizzle-orm/mssql-core";

export const table = mssqlTable('table', {
	smallint: smallint()
});
CREATE TABLE [table] (
	[smallint] smallint
);
import { smallint, mssqlTable } from "drizzle-orm/mssql-core";

export const table = mssqlTable('table', {
	smallint1: smallint().default(10),
});
CREATE TABLE [table] (
	[smallint1] smallint CONSTRAINT [table_smallint1_default] DEFAULT ((10))
);

tinyint

tinyint

小范围有符号 1 字节整数

import { tinyint, mssqlTable } from "drizzle-orm/mssql-core";

export const table = mssqlTable('table', {
	tinyint: tinyint()
});
CREATE TABLE [table] (
	[tinyint] tinyint
);
import { tinyint, mssqlTable } from "drizzle-orm/mssql-core";

export const table = mssqlTable('table', {
	tinyint1: tinyint().default(10),
});
CREATE TABLE [table] (
	[tinyint1] tinyint CONSTRAINT [table_tinyint1_default] DEFAULT ((10))
);

bigint

bigint

有符号 8 字节整数

如果你预期的值介于 2^31 和 2^53 之间,可以使用 mode: 'number',并处理 JavaScript 的 number 而不是 bigint。

import { bigint, mssqlTable } from "drizzle-orm/mssql-core";

export const table = mssqlTable('table', {
	bigint: bigint({ mode: 'number' })
});

// 将推断为 `number`
bigint: bigint({ mode: 'number' })

// 将推断为 `bigint`
bigint: bigint({ mode: 'bigint' })

// 将推断为 `string`
bigint: bigint({ mode: 'string' })
CREATE TABLE [table] (
	[bigint] bigint
);
import { bigint, mssqlTable } from "drizzle-orm/mssql-core";

export const table = mssqlTable('table', {
	bigint1: bigint({ mode: 'number' }).default(10)
});
CREATE TABLE [table] (
	[bigint1] bigint CONSTRAINT [table_bigint1_default] DEFAULT ((10))
);

---

bit

一种 int 数据类型,可以取值为 10NULL

Drizzle 也接受 truefalse 作为值,而不是 10

import { bit, mssqlTable } from "drizzle-orm/mssql-core";

export const table = mssqlTable('table', {
	bit: bit()
});
CREATE TABLE [table] (
	[bit] bit
);

---

text

text
服务器代码页中的可变长度非 Unicode 数据,最大字符串长度为 2^31 - 1(2,147,483,647)

更多信息请参阅官方 MSSQL 文档。

你可以定义 { enum: ["value1", "value2"] } 配置来推断 insertselect 类型,它不会检查运行时值。

import { text, mssqlTable } from "drizzle-orm/mssql-core";

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

// will be inferred as text: "value1" | "value2" | null
text: text({ enum: ["value1", "value2"] })
CREATE TABLE [table] (
	[text] text
);

ntext

ntext
最大字符串长度为 2^30 - 1(1,073,741,823)的可变长度 Unicode 数据。

更多信息请参阅官方 MSSQL 文档。

你可以定义 { enum: ["value1", "value2"] } 配置来推断 insertselect 类型,它不会检查运行时值。

import { ntext, mssqlTable } from "drizzle-orm/mssql-core";

export const table = mssqlTable('table', {
  ntext: ntext()
});

// will be inferred as text: "value1" | "value2" | null
ntext: ntext({ enum: ["value1", "value2"] })
CREATE TABLE [table] (
	[ntext] ntext
);

varchar

varchar(n|max)
可变大小字符串数据。使用 n 定义字符串大小(以字节为单位),其值可以从 1 到 8,000

更多信息请参阅官方 MSSQL 文档。

你可以定义 { enum: ["value1", "value2"] } 配置来推断 insertselect 类型,它不会检查运行时值。

根据 MSSQL 文档,length 参数是可选的。

import { varchar, mssqlTable } from "drizzle-orm/mssql-core";

export const table = mssqlTable('table', {
  varchar1: varchar(),
  varchar2: varchar({ length: 256 }),
  varchar3: varchar({ length: 'max' })
});

// will be inferred as text: "value1" | "value2" | null
varchar: varchar({ enum: ["value1", "value2"] });
CREATE TABLE [table] (
	[varchar1] varchar,
	[varchar2] varchar(256),
	[varchar3] varchar(max)
);

nvarchar

nvarchar(n|max)
可变大小字符串数据。n 的值定义了以字节对为单位的字符串大小

更多信息请参阅官方 MSSQL 文档。

你可以定义 { enum: ["value1", "value2"] } 配置来推断 insertselect 类型,它不会检查运行时值。

根据 MSSQL 文档,length 参数是可选的。

import { nvarchar, mssqlTable } from "drizzle-orm/mssql-core";

export const table = mssqlTable('table', {
  nvarchar1: nvarchar(),
  nvarchar2: nvarchar({ length: 256 }),
});

// will be inferred as text: "value1" | "value2" | null
nvarchar: nvarchar({ enum: ["value1", "value2"] });

// will be inferred as `json`
nvarchar: nvarchar({ mode: 'json' })
CREATE TABLE [table] (
	[nvarchar1] nvarchar,
	[nvarchar2] nvarchar(256)
);

char

char(n)

固定大小字符串数据。n 定义字符串大小(以字节为单位),且必须是 1 到 8,000 之间的值

更多信息请参阅官方 MSSQL 文档。

你可以定义 { enum: ["value1", "value2"] } 配置来推断 insertselect 类型,它不会检查运行时值。

根据 MSSQL 文档,length 参数是可选的。

import { char, mssqlTable } from "drizzle-orm/mssql-core";

export const table = mssqlTable('table', {
  char1: char(),
  char2: char({ length: 256 }),
});

// will be inferred as text: "value1" | "value2" | null
char: char({ enum: ["value1", "value2"] });
CREATE TABLE [table] (
	[char1] char(1),
	[char2] char(256)
);

nchar

nchar(n)

固定大小字符串数据。n 定义字符串大小(以字节对为单位),且必须是 1 到 4,000 之间的值

更多信息请参阅官方 MSSQL 文档。

你可以定义 { enum: ["value1", "value2"] } 配置来推断 insertselect 类型,它不会检查运行时值。

根据 MSSQL 文档,length 参数是可选的。

import { nchar, mssqlTable } from "drizzle-orm/mssql-core";

export const table = mssqlTable('table', {
  nchar1: nchar(),
  nchar2: nchar({ length: 256 }),
});

// will be inferred as text: "value1" | "value2" | null
nchar: nchar({ enum: ["value1", "value2"] });
CREATE TABLE [table] (
	[nchar1] nchar(1),
	[nchar2] nchar(256)
);

---

binary

长度为 n 字节的固定长度二进制数据,其中 n 的取值范围为 1 到 8,000。存储大小为 n 字节。

import { binary, mssqlTable } from "drizzle-orm/mssql-core";

export const table = mssqlTable('table', {
	binary: binary(),
	binary1: binary({ length: 256 })
});
CREATE TABLE [table] (
	[binary] binary,
	[binary1] binary(256)
);

varbinary

可变长度二进制数据。n 的取值范围为 1 到 8,000。max 表示最大存储大小为 2^31-1 字节

import { varbinary, mssqlTable } from "drizzle-orm/mssql-core";

export const table = mssqlTable('table', {
	varbinary: varbinary(),
	varbinary1: varbinary({ length: 256 }),
	varbinary2: varbinary({ length: 'max' })
});
CREATE TABLE [table] (
	[varbinary] varbinary,
	[varbinary1] varbinary(256),
	[varbinary2] varbinary(max)
);

---

numeric

numeric

固定精度和小数位数的数字。当使用最大精度时,有效值范围为 -10^38 + 1 到 10^38 - 1

更多信息请参考官方 MSSQL 文档。

import { numeric, mssqlTable } from "drizzle-orm/mssql-core";

export const table = mssqlTable('table', {
  numeric1: numeric(),
  numeric2: numeric({ precision: 100 }),
  numeric3: numeric({ precision: 100, scale: 20 })
//   numericNum: numeric({ mode: 'number' }),
//   numericBig: numeric({ mode: 'bigint' }),
});
CREATE TABLE [table] (
	[numeric1] numeric,
	[numeric2] numeric(100),
	[numeric3] numeric(100, 20)
);

decimal

numeric。 的别名

real

real 的 ISO 同义词是 float(24)。

更多信息请参考官方 MSSQL 文档。

import { real, mssqlTable } from "drizzle-orm/mssql-core";  

export const table = mssqlTable('table', {
	real1: real(),
	real2: real().default(10.10)
});
CREATE TABLE [table] (
	[real1] real,
	[real2] real CONSTRAINT [table_real2_default] DEFAULT ((10.1))
);

float

float [ (n) ] 其中 n 是用于以科学计数法存储 float 数字尾数的位数,因此决定了精度和存储大小。如果指定了 n,则必须是 1 到 53 之间的值。n 的默认值为 53。

更多信息请参考官方 MSSQL 文档。

import { float, mssqlTable } from "drizzle-orm/mssql-core";

export const table = mssqlTable('table', {
	float1: float(),
	float2: float({ precision: 16 })
});
CREATE TABLE [table] (
	[float1] float,
	[float2] float(16)
);

---

time

time

定义一天中的时间。该时间不包含时区信息,并基于 24 小时制。

更多信息请参阅官方 MSSQL 文档

import { time, mssqlTable } from "drizzle-orm/mssql-core";

export const table = mssqlTable('table', {
  time1: time(),
  time2: time({ mode: 'string' }),
  time3: time({ precision: 6 }),
  time4: time({ precision: 6, mode: 'date' })
});
CREATE TABLE [table] (
	[time1] time,
	[time2] time,
	[time3] time(6),
	[time4] time(6)
);

date

date

日历日期(年、月、日)

更多信息请参阅官方 MSSQL 文档

import { date, mssqlTable } from "drizzle-orm/mssql-core";

export const table = mssqlTable('table', {
	date: date(),
});
CREATE TABLE [table] (
	[date] date
);

你可以指定 datestring 推断模式:

// 将推断为 date
date: date({ mode: "date" }),

// 将推断为 string
date: date({ mode: "string" }),

datetime

datetime

定义一个与一天中的时间相结合的日期,包含基于 24 小时制的秒小数部分。

MSSQL docs

新项目中应避免使用 datetime。请改用 time、date、datetime2 和 datetimeoffset 数据类型。这些类型符合 SQL 标准,并且更具可移植性。time、datetime2 和 datetimeoffset 提供更高的秒精度。datetimeoffset 为全球部署的应用程序提供时区支持。

更多信息请参阅官方 MSSQL 文档

import { datetime, mssqlTable } from "drizzle-orm/mssql-core";

export const table = mssqlTable('table', {
	datetime: datetime(),
});
CREATE TABLE [table] (
	[datetime] datetime
);

你可以指定 datestring 推断模式:

// 将推断为 date
datetime: datetime({ mode: "date" }),

// 将推断为 string
datetime: datetime({ mode: "string" }),

datetime2

datetime2

定义一个与一天中的时间相结合的日期,基于 24 小时制。datetime2 可视为现有 datetime 类型的扩展,具有更大的日期范围、更高的默认小数精度以及可由用户指定的可选精度。

更多信息请参阅官方 MSSQL 文档

import { datetime2, mssqlTable } from "drizzle-orm/mssql-core";

export const table = mssqlTable('table', {
	datetime2: datetime2(),
});
CREATE TABLE [table] (
	[datetime2] datetime2
);

你可以指定 datestring 推断模式:

// 将推断为 date
datetime2: datetime2({ mode: "date" }),

// 将推断为 string
datetime2: datetime2({ mode: "string" }),

datetimeoffset

datetimeoffset

定义一个与一天中的时间相结合的日期,基于 24 小时制,类似于 datetime2,并基于协调世界时(UTC)增加时区感知。

更多信息请参阅官方 MSSQL 文档

import { datetimeoffset, mssqlTable } from "drizzle-orm/mssql-core";

export const table = mssqlTable('table', {
	datetimeoffset: datetimeoffset(),
});
CREATE TABLE [table] (
	[datetimeoffset] datetimeoffset
);

你可以指定 datestring 推断模式:

// 将推断为 date
datetimeoffset: datetimeoffset({ mode: "date" }),

// 将推断为 string
datetimeoffset: datetimeoffset({ mode: "string" }),

---

自定义数据类型

每个列构建器都有一个 .$type() 方法,它允许你自定义该列的数据类型。

这在例如未知类型或品牌类型时非常有用:

type UserId = number & { __brand: 'user_id' };

export const users = mssqlTable('users', {
  id: int().$type<UserId>().primaryKey(),
});

默认值

DEFAULT 子句指定当用户在执行 INSERT 时没有显式提供值时,该列要使用的默认值。 如果列定义上没有显式附加 DEFAULT 子句, 那么该列的默认值就是 NULL

显式的 DEFAULT 子句可以指定默认值为 NULL

import { int, mssqlTable, text } from "drizzle-orm/mssql-core";

export const table = mssqlTable('table', {
	int: int().default(42),
	text: text().default('text'),
});
CREATE TABLE [table] (
	[int] int CONSTRAINT [table_int_default] DEFAULT ((42)),
	[text] text CONSTRAINT [table_text_default] DEFAULT ('text')
);

当使用 $default()$defaultFn() 时,它们只是同一个函数的不同别名, 你可以在运行时生成默认值,并在所有插入查询中使用这些值。

注意:此值不会影响 drizzle-kit 的行为,它只会在 drizzle-orm 运行时使用

import { text, mssqlTable } from "drizzle-orm/mssql-core";
import { createId } from '@paralleldrive/cuid2';

export const table = mssqlTable('table', {
	id: text().$defaultFn(() => createId()),
});

当使用 $onUpdate()$onUpdateFn() 时,它们只是同一个函数的不同别名, 你可以在运行时生成默认值,并在所有更新查询中使用这些值。

为该列添加一个动态更新值。该函数会在行被更新时调用, 并且如果没有提供其他值,则返回值将被用作该列的值。 如果没有提供默认值(或 $defaultFn),那么该函数也会在 行被插入时调用,并且返回值将被用作该列的值。

注意:此值不会影响 drizzle-kit 的行为,它只会在 drizzle-orm 运行时使用

import { int, datetime2, text, mssqlTable } from "drizzle-orm/mssql-core";
import { SQL, sql } from 'drizzle-orm';

export const table = mssqlTable('table', {
	updateCounter: int().default(sql`1`).$onUpdateFn((): SQL => sql`${table.updateCounter} + 1`),
	updatedAt: datetime2({ mode: 'date', precision: 3 }).$onUpdate(() => new Date()),
	alwaysNull: text().$type<string | null>().$onUpdate(() => null),
});

非空

NOT NULL 约束规定相关列不能包含 NULL 值。

import { int, mssqlTable } from "drizzle-orm/mssql-core";

export const table = mssqlTable('table', {
	int: int().notNull(),
});
CREATE TABLE [table] (
	[int] int NOT NULL
);

主键

主键约束表示某一列或一组列可用作表中行的唯一标识符。 这要求这些值既唯一又非空。

import { int, mssqlTable } from "drizzle-orm/mssql-core";

export const table = mssqlTable('table', {
	id: int().primaryKey(),
});
CREATE TABLE [table] (
	[id] int,
	CONSTRAINT [table_pkey] PRIMARY KEY([id])
);