跳至主要内容

大小写敏感性

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

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

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

如果您使用 MongoDB 连接器,Prisma Client 使用正则表达式规则来实现大小写不敏感过滤。该连接器不使用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 使用正则表达式规则进行大小写不敏感过滤。

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 表并创建一个新的 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 中不可用。

© . This site is unofficial and not affiliated with Prisma Data, Inc.