大小写敏感性
大小写敏感性会影响数据的过滤和排序,并由您的数据库排序规则决定。根据您的设置,数据的排序和过滤会产生不同的结果。
| 操作 | 大小写敏感 | 大小写不敏感 |
|---|---|---|
| 升序排序 | Apple, Banana, apple pie, banana pie | Apple, apple pie, Banana, banana pie |
匹配 "apple" | apple | Apple, apple |
如果您使用关系型数据库连接器,Prisma Client 会遵循您的数据库排序规则。Prisma Client 支持大小写不敏感过滤和排序的选项和建议取决于您的数据库提供程序。
如果您使用 MongoDB 连接器,Prisma Client 使用正则表达式规则来实现大小写不敏感过滤。该连接器不使用MongoDB 排序规则。
注意:请在 GitHub 上关注大小写不敏感排序的进展。
数据库排序规则和大小写敏感性
在 Prisma Client 的上下文中,以下部分仅指关系型数据库连接器。
排序规则指定了数据在数据库中如何排序和比较,其中包括大小写。排序规则是您在设置数据库时选择的。
以下示例演示如何查看 MySQL 数据库的排序规则
SELECT @@character_set_database, @@collation_database;
+--------------------------+----------------------+
| @@character_set_database | @@collation_database |
+--------------------------+----------------------+
| utf8mb4 | utf8mb4_0900_ai_ci |
+--------------------------+----------------------+
示例排序规则 utf8mb4_0900_ai_ci,是
- 不区分重音符号 (
ai) - 不区分大小写 (
ci)。
这意味着 prisMa 将匹配 prisma、PRISMA、priSMA 等
SELECT id, email FROM User WHERE email LIKE "%prisMa%"
+----+-----------------------------------+
| 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 数据库中创建索引以提高性能
- 为使用
equals或not的 Prisma Client 查询创建表达式索引 - 使用
pg_trgm模块为使用startsWith、endsWith、contains(在 PostgreSQL 中映射到LIKE/ILIKE)的 Prisma Client 查询创建基于三元组的索引
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 中不可用。