跳到主要内容

大小写敏感性

大小写敏感性影响数据的过滤排序,并由你的数据库排序规则决定。数据排序和过滤的结果会因你的设置而异

操作大小写敏感大小写不敏感
升序排序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 | alice@prisma.io |
| 49 | birgitte@prisma.io |
+----+-----------------------------------+

使用 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表并创建一个新的User表,其中包含COLLATE NOCASE

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

© . All rights reserved.