メインコンテンツへスキップ

ケースセンシティブ

ケースセンシティブは、データのフィルタリングソートに影響を与え、データベースの照合順序によって決定されます。ソートとフィルタリングの結果は、設定によって異なります

アクションケースセンシティブケースインセンシティブ
昇順ソート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)。

これは、prisMaprismaPRISMApriSMAなどに一致することを意味します

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プロバイダー

デフォルトでは、SQLiteデータベースのPrisma Clientによって作成されたテキストフィールドは、ケースインセンシティブなフィルタリングをサポートしていません。SQLiteでは、ASCII文字のケースインセンシティブな比較のみが可能です。

列ごとにケースインセンシティブなフィルタリングの限定的なサポート(ASCIIのみ)を有効にするには、テキスト列を定義するときにCOLLATE NOCASEを追加する必要があります。

新しい列にケースインセンシティブなフィルタリングを追加する。

新しい列にケースインセンシティブなフィルタリングを追加するには、Prisma Clientによって作成されたマイグレーションファイルを変更する必要があります。

次のPrismaスキーマモデルを例として、

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スキーマモデルを例として、

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では利用できません。