ケースセンシティブ
ケースセンシティブは、データのフィルタリングとソートに影響を与え、データベースの照合順序によって決定されます。ソートとフィルタリングの結果は、設定によって異なります
アクション | ケースセンシティブ | ケースインセンシティブ |
---|---|---|
昇順ソート | 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プロバイダー
デフォルトでは、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では利用できません。