2010-10-01 6 views
3

Je cherche à effectuer une recherche insensible à la casse dans une base de données Firebird, sans modifier les requêtes réelles. En d'autres termes, j'aimerais que toutes mes instructions "SELECT/WHERE/LIKE" existantes récupèrent BOB, Bob et Bob. La configuration de Firebird permet-elle de modifier ce comportement?Configuration Firebird - désactiver la sensibilité à la casse

+1

La sensibilité à la casse est définie par le classement pour une base de données et est généralement rendue évidente dans le nom de classement ("cs" signifie "sensible à la casse", tandis que "ci" signifie "Case InSENSitive"). Voici un lien vers les collations de Firebird: http://www.firebirdsql.org/refdocs/langrefupd21-collations.html –

Répondre

0

Finalement, je suis allé à la création de colonnes d'ombre contenant des versions inférieures tubé des champs obligatoires.

+0

Ce qui signifie que vous deviez réellement modifier la requête ... –

2

Essayez d'utiliser quelque chose comme: Imaginez que vous avez une table de personnes comme celle-ci:

CREATE TABLE PERSONS (
    PERS_ID INTEGER NOT NULL PRIMARY KEY, 
    LAST_NAME VARCHAR(50), 
    FIRST_NAME VARCHAR(50) 
); 

Maintenant, il y a une application qui permet à l'utilisateur de rechercher les personnes par nom et/ou prénom . Ainsi, l'utilisateur entre le nom de famille de la personne qu'il cherche.

Nous voulons que cette recherche soit insensible à la casse, c'est-à-dire que l'utilisateur entre "Presley", "presley", "PRESLEY", ou même "PrESley", nous voulons toujours trouver le roi.

Ah oui, et nous voulons que cette recherche soit rapide, s'il vous plaît. Il doit donc y avoir un index qui l'accélère.

Une méthode simple pour effectuer des comparaisons insensibles à la casse consiste à mettre en majuscules les deux chaînes, puis à comparer les versions majuscules des deux chaînes.

La mise en majuscule a des limites, car certaines lettres ne peuvent pas être majuscules. Notez aussi qu'il y a des langages/scripts où il n'y a pas de cas. Ainsi, la technique décrite dans cet article fonctionnera mieux pour les langues européennes.

Afin d'obtenir des résultats vraiment parfaits, il faudrait un assemblage insensible à la casse (CI) et/ou insensible aux accents (AI). Cependant, au moment de la rédaction de ce document (juillet 2006), il n'y a que deux classements d'AI/CI pour Firebird 2.0. La situation devrait s'améliorer avec le temps.

(Vous devez connaître les concepts de jeux de caractères et interclassement afin de comprendre ce qui vient ensuite. J'utilise la collation DE_DE dans mes exemples, c'est la collation pour l'allemand/Allemagne dans le jeu de caractères ISO8859_1.)

Pour obtenir les résultats corrects de la fonction UPPER() intégrée à Firebird, vous devez spécifier un classement. Cela peut être dans la définition DDL de la table:

CREATE TABLE PERSONS (
    PERS_ID INTEGER NOT NULL PRIMARY KEY, 
    LAST_NAME VARCHAR(50) COLLATE DE_DE, 
    FIRST_NAME VARCHAR(50) COLLATE DE_DE 
); 

ou il peut être fait lorsque vous appelez la fonction UPPER():

SELECT UPPER (LAST_NAME COLLATE DE_DE) FROM PERSONS; 

http://www.destructor.de/firebird/caseinsensitivesearch.htm

ou vous pouvez modifier vos requêtes et ajoutez la lower() fonction

LOWER() 

A vailable en: DSQL, ESQL, PSQL

Ajouté en: 2,0

Description: Renvoie l'équivalent minuscule de la chaîne d'entrée. Cette fonction met également correctement en minuscules les caractères non-ASCII, même si le classement par défaut (binaire) est utilisé. Le jeu de caractères doit cependant être approprié: avec ASCII ou NONE par exemple, seuls les caractères ASCII sont en minuscules; avec OCTETS, la chaîne entière est retournée inchangée.

Type de résultat: VAR(CHAR)

Syntaxe:

LOWER (str) 

Important

Si la fonction externe LOWER est déclarée dans votre base de données, il la fonction interne obscurcir. Pour rendre la fonction interne disponible, DROP ou ALTER la fonction externe (UDF).

Exemple:

select field from table 
    where lower(Name) = 'bob' 

http://www.firebirdsql.org/refdocs/langrefupd21-intfunc-lower.html

Questions connexes