PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Solution Ruby générique pour SQLite3 LIKE ou PostgreSQL ILIKE ?

La racine du problème se trouve ici :

J'utilise SQLite3 pour le développement et PostgreSQL pour le déploiement.

C'est une mauvaise idée™. Vous continuerez à rencontrer des incompatibilités - ou pire :vous ne vous en rendrez pas compte tant que le mal n'est pas fait.
Utilisez le même RDBMS (PostgreSQL) pour le développement et la production et évitez les ennuis inutiles.

Pendant que vous êtes coincé avec votre configuration malheureuse, il existe une solution simple :

lower(style) LIKE lower(?)

Fonctionne sur les deux plates-formes.

  • Vous pouvez supprimer le lower() de droite , si vous fournissez un modèle de recherche en minuscules.

  • En SQLite standard lower(X) ne plie que les lettres ASCII. Pour en savoir plus, je cite le chapitre Core Functions du manuel SQLite :

    La fonction lower(X) renvoie une copie de la chaîne X avec tous les caractères ASCII convertis en minuscules. La fonction intégrée lower() par défaut ne fonctionne que pour les caractères ASCII. Pour effectuer des conversions de casse sur des caractères non ASCII, chargez l'extension ICU .

    C'est moi qui souligne.

  • PostgreSQL lower(X) fonctionne avec UTF-8 prêt à l'emploi.

Comme effet secondaire bienvenu, vous pouvez accélérer cette requête dans PostgreSQL avec un index sur l'expression lower(style) , ce qui sera plus rapide que d'utiliser ILIKE et un index de base sur le style .

De plus, depuis PostgreSQL 9.1, vous pouvez utiliser un index GIN ou GIST avec le pg_trgm extension pour accélérer tout LIKE et LIKE requête - les trigrammes ne sont pas sensibles à la casse. Instructions détaillées et liens dans cette réponse connexe :

  • Chaînes UTF-8 similaires pour le champ de saisie semi-automatique