大文字と小文字の区別
大文字と小文字の区別はデータのフィルタリングとソートに影響し、[データベースの照合順序](#database-collation-and-case-sensitivity)によって決定されます。データのソートとフィルタリングは、設定によって異なる結果をもたらします
アクション | 大文字と小文字を区別 | 大文字と小文字を区別しない |
---|---|---|
昇順でソート | Apple , Banana , apple pie , banana pie | Apple , apple pie , Banana , banana pie |
"apple" に一致 | apple | Apple , apple |
リレーショナルデータベースコネクタを使用している場合、[Prisma Client](/docs/orm/prisma-client)はデータベースの照合順序を尊重します。Prisma Clientで大文字と小文字を区別しないフィルタリングとソートをサポートするためのオプションと推奨事項は、[データベースプロバイダ](#options-for-case-insensitive-filtering)によって異なります。
MongoDBコネクタを使用している場合、[Prisma Client](/docs/orm/prisma-client/queries)はRegExルールを使用して大文字と小文字を区別しないフィルタリングを有効にします。このコネクタは[MongoDBの照合順序](https://www.mongodb.com/docs/manual/reference/collation/)を使用しません。
注: [GitHubでの大文字と小文字を区別しないソート](https://github.com/prisma/prisma-client-js/issues/841)の進捗を追跡してください。
データベースの照合順序と大文字と小文字の区別
Prisma Clientのコンテキストにおいて、以下のセクションはリレーショナルデータベースコネクタのみを指します。
照合順序は、データベース内でデータがどのようにソートされ比較されるかを指定するもので、これには大文字と小文字の区別が含まれます。照合順序はデータベースをセットアップする際に選択します。
次の例は、MySQLデータベースの照合順序を表示する方法を示しています
SELECT @@character_set_database, @@collation_database;
+--------------------------+----------------------+
| @@character_set_database | @@collation_database |
+--------------------------+----------------------+
| utf8mb4 | utf8mb4_0900_ai_ci |
+--------------------------+----------------------+
例の照合順序である、[`utf8mb4_0900_ai_ci`](https://dev.mysql.com/doc/refman/8.0/en/charset-collation-names.html)は
- アクセントを区別しない(`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はデフォルトで[決定論的な照合順序](https://www.postgresql.org/docs/current/collation.html#COLLATION-NONDETERMINISTIC)を使用するため、フィルタリングは大文字と小文字を区別します。大文字と小文字を区別しないフィルタリングをサポートするには、フィールドごとに`mode: 'insensitive'`プロパティを使用します。
フィルタで`mode`プロパティを次のように使用します
const users = await prisma.user.findMany({
where: {
email: {
endsWith: 'prisma.io',
mode: 'insensitive', // Default value: default
},
},
})
参照: [フィルタリング (大文字と小文字を区別しないフィルタリング)](/docs/orm/prisma-client/queries/filtering-and-sorting#case-insensitive-filtering)
注意点
- C照合順序では大文字と小文字を区別しないフィルタリングを使用できません
- [`citext`](https://www.postgresql.org/docs/12/citext.html)カラムは常に大文字と小文字を区別せず、`mode`の影響を受けません
パフォーマンス
大文字と小文字を区別しないフィルタリングを多用する場合は、パフォーマンス向上のため[PostgreSQLデータベースにインデックスを作成する](https://www.postgresql.org/docs/current/indexes.html)ことを検討してください
- `equals`または`not`を使用するPrisma Clientクエリのために[式インデックスを作成](https://www.postgresql.org/docs/current/indexes-expressional.html)します
- `pg_trgm`モジュールを使用して、`startsWith`、`endsWith`、`contains`(PostgreSQLの`LIKE` / `ILIKE`にマップされます)を使用するPrisma Clientクエリのために[トライグラムベースのインデックスを作成](https://www.postgresql.org/docs/12/pgtrgm.html#id-1.11.7.40.7)します
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文字の大文字と小文字を区別しない比較](https://www.sqlite.org/faq.html#q18)のみが可能です。
カラムごとに大文字と小文字を区別しないフィルタリングの限定的なサポート(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では利用できません。