跳到主要內容

區分大小寫

區分大小寫會影響資料的篩選排序,並由您的資料庫定序決定。根據您的設定,排序和篩選資料會產生不同的結果

動作區分大小寫不區分大小寫
升序排序AppleBananaapple piebanana pieAppleapple pieBananabanana pie
比對 "apple"appleAppleapple

如果您使用關聯式資料庫連接器Prisma Client 會遵守您的資料庫定序。使用 Prisma Client 支援不區分大小寫的篩選和排序的選項和建議取決於您的資料庫供應商

如果您使用 MongoDB 連接器,Prisma Client 會使用 RegEx 規則來啟用不區分大小寫的篩選。此連接器使用 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 使用 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 中不可用。