大小写敏感性
大小写敏感性影响数据的过滤和排序,并由你的数据库排序规则决定。数据排序和过滤的结果会因你的设置而异
操作 | 大小写敏感 | 大小写不敏感 |
---|---|---|
升序排序 | Apple , Banana , apple pie , banana pie | Apple , apple pie , Banana , banana pie |
匹配 "apple" | apple | Apple , apple |
如果你使用关系型数据库连接器,Prisma Client 会遵循你的数据库排序规则。支持 Prisma Client 大小写不敏感过滤和排序的选项和建议取决于你的数据库提供商。
如果你使用 MongoDB 连接器,Prisma Client 使用 RegEx 规则来实现大小写不敏感的过滤。该连接器不使用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
的 Prisma Client 查询(在 PostgreSQL 中映射到LIKE
/ILIKE
)创建基于三字符组的索引
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 中不可用。