跳到主要內容

大小寫敏感性

大小寫敏感性影響資料的過濾排序,並由你的資料庫排序規則決定。資料排序和過濾的結果會因你的設定而異

操作大小寫敏感大小寫不敏感
升序排序Apple, Banana, apple pie, banana pieApple, apple pie, Banana, banana pie
匹配 "apple"appleApple, apple

如果你使用關係型資料庫聯結器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
);

你需要將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 中不可用。

© . This site is unofficial and not affiliated with Prisma Data, Inc.