跳至主要内容

区分大小写

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

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

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

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

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

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

info

在 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
);

您需要在 email 列中添加 COLLATE NOCASE,才能使不区分大小写过滤成为可能

-- 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 NOCASE 的新 User 表。

-- 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 中不可用。