apps/docs/content/docs.v6/orm/prisma-client/queries/case-sensitivity.mdx
Case sensitivity affects filtering and sorting of data, and is determined by your database collation. Sorting and filtering data yields different results depending on your settings:
| Action | Case sensitive | Case insensitive |
|---|---|---|
| Sort ascending | Apple, Banana, apple pie, banana pie | Apple, apple pie, Banana, banana pie |
Match "apple" | apple | Apple, apple |
If you use a relational database connector, Prisma Client respects your database collation. Options and recommendations for supporting case-insensitive filtering and sorting with Prisma Client depend on your database provider.
If you use the MongoDB connector, Prisma Client uses RegEx rules to enable case-insensitive filtering. The connector does not use MongoDB collation.
Note: Follow the progress of case-insensitive sorting on GitHub.
:::info
In the context of Prisma Client, the following section refers to relational database connectors only.
:::
Collation specifies how data is sorted and compared in a database, which includes casing. Collation is something you choose when you set up a database.
The following example demonstrates how to view the collation of a MySQL database:
SELECT @@character_set_database, @@collation_database;
+--------------------------+----------------------+
| @@character_set_database | @@collation_database |
+--------------------------+----------------------+
| utf8mb4 | utf8mb4_0900_ai_ci |
+--------------------------+----------------------+
The example collation, utf8mb4_0900_ai_ci, is:
ai)ci).This means that prisMa will match prisma, PRISMA, priSMA, and so on:
SELECT id, email FROM User WHERE email LIKE "%prisMa%"
+----+-----------------------------------+
| id | email |
+----+-----------------------------------+
| 61 | [email protected] |
| 49 | [email protected] |
+----+-----------------------------------+
The same query with Prisma Client:
const users = await prisma.user.findMany({
where: {
email: {
contains: "prisMa",
},
},
select: {
id: true,
name: true,
},
});
The recommended way to support case-insensitive filtering with Prisma Client depends on your underlying provider.
PostgreSQL uses deterministic collation by default, which means that filtering is case-sensitive. To support case-insensitive filtering, use the mode: 'insensitive' property on a per-field basis.
Use the mode property on a filter as shown:
const users = await prisma.user.findMany({
where: {
email: {
endsWith: "prisma.io",
mode: "insensitive", // Default value: default
},
},
});
See also: Filtering (Case-insensitive filtering)
citext columns are always case-insensitive and are not affected by modeIf you rely heavily on case-insensitive filtering, consider creating indexes in the PostgreSQL database to improve performance:
equals or notpg_trgm module to create a trigram-based index for Prisma Client queries that use startsWith, endsWith, contains (maps toLIKE / ILIKE in PostgreSQL)MySQL uses case-insensitive collation by default. Therefore, filtering with Prisma Client and MySQL is case-insensitive by default.
mode: 'insensitive' property is not required and therefore not available in the generated Prisma Client API.
_ci) collation in order to support case-insensitive filtering. Prisma Client does no support the mode filter property for the MySQL provider.To support case-insensitive filtering, use the mode: 'insensitive' property on a per-field basis:
const users = await prisma.user.findMany({
where: {
email: {
endsWith: "prisma.io",
mode: "insensitive", // Default value: default
},
},
});
The MongoDB uses a RegEx rule for case-insensitive filtering.
By default, text fields created by Prisma Client in SQLite databases do not support case-insensitive filtering. In SQLite, only case-insensitive comparisons of ASCII characters are possible.
To enable limited support (ASCII only) for case-insensitive filtering on a per-column basis, you will need to add COLLATE NOCASE when you define a text column.
To add case-insensitive filtering to a new column, you will need to modify the migration file that is created by Prisma Client.
Taking the following Prisma Schema model:
model User {
id Int @id
email String
}
and using prisma migrate dev --create-only to create the following migration file:
-- CreateTable
CREATE TABLE "User" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"email" TEXT NOT NULL
);
You would need to add COLLATE NOCASE to the email column in order to make case-insensitive filtering possible:
-- CreateTable
CREATE TABLE "User" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"email" TEXT NOT NULL COLLATE NOCASE -- [!code highlight]
);
Since columns cannot be updated in SQLite, COLLATE NOCASE can only be added to an existing column by creating a blank migration file and migrating data to a new table.
Taking the following Prisma Schema model:
model User {
id Int @id
email String
}
and using prisma migrate dev --create-only to create an empty migration file, you will need to rename the current User table and create a new User table with 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 uses case-insensitive collation by default. Therefore, filtering with Prisma Client and Microsoft SQL Server is case-insensitive by default.
mode: 'insensitive' property is not required and therefore not available in the generated Prisma Client API.