跳到主要内容

大小写敏感性

大小写敏感性影响数据的**筛选**和**排序**,并由您的 数据库排序规则 决定。根据您的设置,排序和筛选数据会产生不同的结果

动作区分大小写不区分大小写
升序排序AppleBananaapple piebanana pieAppleapple pieBananabanana pie
匹配 "apple"appleAppleapple

如果您使用**关系数据库连接器**,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
);

您需要在 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 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 中不可用。