大小寫敏感性
大小寫敏感性影響資料的過濾和排序,並由你的資料庫排序規則決定。資料排序和過濾的結果會因你的設定而異
| 操作 | 大小寫敏感 | 大小寫不敏感 |
|---|---|---|
| 升序排序 | 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 中不可用。