跳转到主要内容

区分大小写

区分大小写影响数据的 过滤排序,并由您的 数据库排序规则 决定。根据您的设置,排序和过滤数据会产生不同的结果

操作区分大小写不区分大小写
升序排序Apple, Banana, apple pie, banana pieApple, apple pie, Banana, banana pie
匹配 "apple"appleApple, apple

如果您使用 关系数据库连接器Prisma Client 会遵循您的数据库排序规则。使用 Prisma Client 支持 不区分大小写 的过滤和排序的选项和建议取决于您的 数据库提供商

如果您使用 MongoDB 连接器,Prisma Client 使用 RegEx 规则来启用不区分大小写的过滤。该连接器使用 MongoDB 排序规则

注意:关注 GitHub 上不区分大小写排序的进展

数据库排序规则和区分大小写

信息

在 Prisma Client 的上下文中,以下部分仅指关系数据库连接器。

排序规则指定了如何在数据库中 排序和比较 数据,其中包括大小写。排序规则是您在设置数据库时选择的。

以下示例演示了如何查看 MySQL 数据库的排序规则

SELECT @@character_set_database, @@collation_database;
显示CLI结果
  +--------------------------+----------------------+
| @@character_set_database | @@collation_database |
+--------------------------+----------------------+
| utf8mb4 | utf8mb4_0900_ai_ci |
+--------------------------+----------------------+

示例排序规则 utf8mb4_0900_ai_ci

  • 不区分重音 (ai)
  • 不区分大小写 (ci)。

这意味着 prisMa 将匹配 prismaPRISMApriSMA

SELECT id, email FROM User WHERE email LIKE "%prisMa%"
显示CLI结果
 +----+-----------------------------------+
| id | email |
+----+-----------------------------------+
| 61 | [email protected] |
| 49 | [email protected] |
+----+-----------------------------------+

使用 Prisma Client 的相同查询

const users = await prisma.user.findMany({
where: {
email: {
contains: 'prisMa',
},
},
select: {
id: true,
name: true,
},
})

不区分大小写过滤的选项

使用 Prisma Client 支持不区分大小写过滤的推荐方法取决于您的底层提供商。

PostgreSQL 提供商

PostgreSQL 默认使用 确定性排序规则,这意味着过滤是 区分大小写 的。要支持不区分大小写的过滤,请在每个字段的基础上使用 mode: 'insensitive' 属性。

在过滤器上使用 mode 属性,如下所示

const users = await prisma.user.findMany({
where: {
email: {
endsWith: 'prisma.io',
mode: 'insensitive', // Default value: default
},
},
})

另请参阅:过滤(不区分大小写过滤)

注意事项

  • 您不能将不区分大小写的过滤与 C 排序规则一起使用
  • citext 列始终不区分大小写,并且不受 mode 的影响

性能

如果您大量依赖不区分大小写的过滤,请考虑 在 PostgreSQL 数据库中创建索引 以提高性能

MySQL 提供商

MySQL 默认使用 不区分大小写的排序规则。因此,使用 Prisma Client 和 MySQL 进行过滤默认情况下是不区分大小写的。

mode: 'insensitive' 属性不是必需的,因此在生成的 Prisma Client API 中不可用。

注意事项

  • 必须使用不区分大小写 (_ci) 的排序规则才能支持不区分大小写的过滤。Prisma Client 不支持 MySQL 提供商的 mode 过滤器属性。

MongoDB 提供商

要支持不区分大小写的过滤,请在每个字段的基础上使用 mode: 'insensitive' 属性

const users = await prisma.user.findMany({
where: {
email: {
endsWith: 'prisma.io',
mode: 'insensitive', // Default value: default
},
},
})

MongoDB 使用 RegEx 规则进行不区分大小写的过滤。

SQLite 提供商

默认情况下,Prisma Client 在 SQLite 数据库中创建的文本字段不支持不区分大小写的过滤。在 SQLite 中,只有 ASCII 字符的不区分大小写比较 是可能的。

要为每个列启用对不区分大小写过滤的有限支持(仅限 ASCII),您需要在定义文本列时添加 COLLATE NOCASE

向新列添加不区分大小写过滤。

要向新列添加不区分大小写的过滤,您需要修改由 Prisma Client 创建的迁移文件。

采用以下 Prisma Schema 模型

model User {
id Int @id
email String
}

并使用 prisma migrate dev --create-only 创建以下迁移文件

-- CreateTable
CREATE TABLE "User" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"email" TEXT NOT NULL
);

您需要将 COLLATE NOCASE 添加到 email 列,以便使不区分大小写的过滤成为可能

-- CreateTable
CREATE TABLE "User" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
//highlight-next-line
"email" TEXT NOT NULL COLLATE NOCASE
);

向现有列添加不区分大小写过滤。

由于无法在 SQLite 中更新列,因此只能通过创建空白迁移文件并将数据迁移到新表来将 COLLATE NOCASE 添加到现有列。

采用以下 Prisma Schema 模型

model User {
id Int @id
email String
}

并使用 prisma migrate dev --create-only 创建一个空迁移文件,您将需要重命名当前的 User 表,并创建一个新的带有 COLLATE NOCASEUser 表。

-- UpdateTable
ALTER TABLE "User" RENAME TO "User_old";

CREATE TABLE "User" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"email" TEXT NOT NULL COLLATE NOCASE
);

INSERT INTO "User" (id, email)
SELECT id, email FROM "User_old";

DROP TABLE "User_old";

Microsoft SQL Server 提供商

Microsoft SQL Server 默认使用 不区分大小写的排序规则。因此,使用 Prisma Client 和 Microsoft SQL Server 进行过滤默认情况下是不区分大小写的。

mode: 'insensitive' 属性不是必需的,因此在生成的 Prisma Client API 中不可用。