Case sensitivity (Prisma ORM v6) (/docs/orm/v6/prisma-client/queries/case-sensitivity)
For the complete Prisma documentation index, see llms.txt. A markdown version of any docs page is available by appending
.mdto its URL.
How Prisma Client handles case sensitivity when filtering and sorting.
Location: ORM > v6 > Prisma Client > Queries > Case sensitivity
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.
Database collation and case sensitivity
Section titled “Database collation and case sensitivity”[!NOTE] 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:
- Accent-insensitive (
ai) - Case-insensitive (
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 | alice@prisma.io |
| 49 | birgitte@prisma.io |
+----+-----------------------------------+The same query with Prisma Client:
const users = await prisma.user.findMany({
where: {
email: {
contains: "prisMa",
},
},
select: {
id: true,
name: true,
},
});Options for case-insensitive filtering
Section titled “Options for case-insensitive filtering”The recommended way to support case-insensitive filtering with Prisma Client depends on your underlying provider.
PostgreSQL provider
Section titled “PostgreSQL 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)
Caveats
Section titled “Caveats”- You cannot use case-insensitive filtering with C collation
citextcolumns are always case-insensitive and are not affected bymode
Performance
Section titled “Performance”If you rely heavily on case-insensitive filtering, consider creating indexes in the PostgreSQL database to improve performance:
- Create an expression index for Prisma Client queries that use
equalsornot - Use the
pg_trgmmodule to create a trigram-based index for Prisma Client queries that usestartsWith,endsWith,contains(maps toLIKE/ILIKEin PostgreSQL)
MySQL provider
Section titled “MySQL provider”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.
Caveats
Section titled “Caveats”- You must use a case-insensitive (
_ci) collation in order to support case-insensitive filtering. Prisma Client does no support themodefilter property for the MySQL provider.
MongoDB provider
Section titled “MongoDB 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.
SQLite provider
Section titled “SQLite provider”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.
Adding case-insensitive filtering to a new column.
Section titled “Adding case-insensitive filtering to a new 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:
-- CreateTableCREATE TABLE "User" ( "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "email" TEXT NOT NULL COLLATE NOCASE);Adding case-insensitive filtering to an existing column.
Section titled “Adding case-insensitive filtering to an existing column.”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 provider
Section titled “Microsoft SQL Server provider”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.
Related pages
Section titled “Related pages”Aggregation, grouping, and summarizing: Use Prisma Client to aggregate, group by, count, and select distinct.Computed fields: This page explains how to use client extensions to add computed fields to Prisma models.CRUD: How to perform CRUD with Prisma Client.Custom models: This page explains how to wrap Prisma Client in custom modelsCustom validation: This page explains how to add custom validation to Prisma Client