L'approche la plus courante consiste à mettre en minuscules ou en majuscules la chaîne de recherche et les données. Mais cela pose deux problèmes.
- Il fonctionne en anglais, mais pas dans toutes les langues. (Peut-être même pas dans la plupart des langues). Chaque lettre minuscule ne correspond pas à une lettre lettre majuscule correspondante ; chaque lettre majuscule n'a pas une lettre lettre minuscule correspondante.
- En utilisant des fonctions comme lower() et upper(), vous obtiendrez un résultat séquentiel. séquentiel. Il ne peut pas utiliser d'index. Sur mon système de test, l'utilisation de lower() prend environ 2000 fois plus long qu'une requête qui peut utiliser un index. (Les données de test ont un peu plus de 100k lignes).
Il existe au moins trois solutions moins fréquemment utilisées qui pourraient être plus efficaces.
- Utilisez le module citext qui imite le plus souvent le comportement d'un type de données insensible à la casse. Après avoir chargé ce module, vous pouvez créer un index insensible à la casse en utilisant la méthode suivante
CREATE INDEX ON groups (name::citext);
. (Mais voir ci-dessous.)
- Utilisez une collation insensible à la casse. Ce paramètre est défini lorsque vous initialisez une base de données. L'utilisation d'une collation insensible à la casse signifie que vous pouvez accepter accepter à peu près n'importe quel format de code client, et vous retournerez toujours résultats utiles. (Cela signifie également que vous ne pouvez pas faire de requêtes sensibles à la casse. Duh.)
- Créez un index fonctionnel. Créez un index minuscule en utilisant
CREATE INDEX ON groups (LOWER(name));
. Après avoir fait cela, vous pouvez profiter de l'index avec des requêtes comme SELECT id FROM groups WHERE LOWER(name) = LOWER('ADMINISTRATOR');
ou SELECT id FROM groups WHERE LOWER(name) = 'administrator';
Vous devez souvenez-vous de d'utiliser LOWER(), cependant.
Le module citext ne fournit pas un véritable type de données insensible à la casse. Au lieu de cela, il se comporte comme si chaque chaîne était en minuscule. C'est-à-dire qu'il se comporte comme si vous aviez appelé lower()
sur chaque corde, comme dans le numéro 3 ci-dessus. L'avantage est que les programmeurs n'ont pas à se souvenir de mettre les chaînes en minuscules. Mais vous devez lire les sections "String Comparison Behavior" et "Limitations" dans la documentation avant de décider d'utiliser citext.
0 votes
Si citext est fourni avec votre installation Postgres, essayez le type citext. C'est un texte insensible à la casse
2 votes
Pour les nouveaux venus à cette question, ce lien La documentation officielle de postgres contient toutes les réponses données ici, ainsi que quelques autres options.
1 votes
Monsieur, réassignez la réponse acceptée à celle faite par @Arun s'il vous plaît. Elle est beaucoup moins compliquée et n'entraîne pas un tas de problèmes après l'application.