區分大小寫
區分大小寫會影響資料的篩選和排序,並由您的資料庫定序決定。根據您的設定,排序和篩選資料會產生不同的結果
動作 | 區分大小寫 | 不區分大小寫 |
---|---|---|
升序排序 | 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
(對應至 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 使用 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 NOCASE
的新 User
表格。
-- 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 中不可用。