MSSQL 列类型

WARNING

本页说明的是 drizzle 版本 1.0.0-beta.2 及更高版本支持的概念。

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

我们对所有这些类型都提供了原生支持,如果这些还不能满足你的需求,欢迎创建 自定义类型

重要

本部分文档中的所有示例均未使用数据库列名别名,列名由 TypeScript 键自动生成。

如果需要,可以在列名中使用数据库别名,也可以使用 casing 参数为 Drizzle 定义映射策略。

你可以在此处了解更多相关内容 here

int

有符号 4 字节整数

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

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

export const table = pgTable('table', {
	int1: int().default(10),
});
CREATE TABLE [table] (
	[int1] int 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 { sql } from "drizzle-orm";
import { smallint, mssqlTable } from "drizzle-orm/mssql-core";

export const table = mssqlTable('table', {
	smallint1: smallint().default(10),
});
CREATE TABLE [table] (
	[smallint1] smallint 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 { sql } from "drizzle-orm";
import { tinyint, mssqlTable } from "drizzle-orm/mssql-core";

export const table = mssqlTable('table', {
	tinyint1: tinyint().default(10),
});
CREATE TABLE [table] (
	[tinyint1] tinyint 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 { sql } from "drizzle-orm";
import { bigint, mssqlTable } from "drizzle-orm/mssql-core";

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

---

bit

一种整数数据类型,值可以为 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()
});

// 类型推断为 text: "value1" | "value2" | null
text: text({ enum: ["value1", "value2"] })
CREATE TABLE [table] (
	[text] text
);

ntext

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

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

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

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

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

// 类型推断为 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' })
});

// 类型推断为 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 }),
});

// 类型推断为 text: "value1" | "value2" | null
nvarchar: nvarchar({ enum: ["value1", "value2"] }),

// 类型推断为 `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 }),
});

// 类型推断为 text: "value1" | "value2" | null
char: char({ enum: ["value1", "value2"] }),
CREATE TABLE [table] (
	[char1] char,
	[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 }),
});

// 类型推断为 text: "value1" | "value2" | null
nchar: nchar({ enum: ["value1", "value2"] }),
CREATE TABLE [table] (
	[nchar1] nchar,
	[nchar2] nchar(256)
);

---

binary

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

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

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";

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 { sql } from "drizzle-orm";
import { real, mssqlTable } from "drizzle-orm/mssql-core";  

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

float

float [ (n) ],其中 n 表示用于存储以科学计数法表示的浮点数尾数的位数,决定了精度和存储大小。若指定 n,其值必须在 1 到 53 之间。默认值为 53。

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

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

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

---

time

time

定义一天中的时间。此时间无时区信息,是基于 24 小时制的。

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

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

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";

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 文档

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

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

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

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";

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";

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' };
type Data = {
	foo: string;
	bar: number;
};

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

默认值

DEFAULT 子句指定当用户执行 INSERT 时未显式提供该列值时所使用的默认值。 如果列定义中没有显式的 DEFAULT 子句,则该列的默认值为 NULL

显式的 DEFAULT 子句可以指定默认值为 NULL、字符串常量、二进制常量、有符号数字,或用括号包裹的任意常量表达式。

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

const table = mssqlTable('table', {
	integer: integer().default(42),
	text: text().default('text'),
});
CREATE TABLE [table] (
	[integer1] integer DEFAULT 42,
	[text] text DEFAULT 'text',
);

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

注意:该值不会影响 drizzle-kit 的行为,仅在运行时 drizzle-orm 中生效。

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

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

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

该函数会在行更新时调用,如果未提供列值,则函数返回值将用作该列值。 如果未提供默认值(或 $defaultFn),该函数在行插入时也会调用,并返回该列的值。

注意:该值不会影响 drizzle-kit 的行为,仅在运行时 drizzle-orm 中生效。

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

const table = mssqlTable('table', {
	updateCounter: int().default(sql`1`).$onUpdateFn((): SQL => sql`${table.update_counter} + 1`),
	updatedAt: timestamp({ 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";

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

主键

主键约束表明一列或一组列可以作为表中行的唯一标识符。 这要求值必须唯一且非空。

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

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