Vous n'êtes pas identifié(e).
Bonjour à tous,
j'utilisais jusqu'à aujourd'hui la formule de conversion suivante :
select LOWER(TO_ASCII(CONVERT('Azerbaïdjan', 'UNICODE', 'LATIN9'), 'LATIN9'))
select LOWER(TO_ASCII(CONVERT('Algérie', 'UNICODE', 'LATIN9'), 'LATIN9'))
qui me permet de récupérer une chaine sans caractères spéciaux afin de pouvoir effectuer ensuite une recherche ou un filtre sur une partie de la chaine.
la requête réellement passée est celle ci :
SELECT idpays, nompays, zonepays, devisepays FROM pays WHERE LOWER(TO_ASCII(CONVERT(nompays, 'UNICODE', 'LATIN9'), 'LATIN9')) LIKE 'm%' ORDER BY nompays ASC
qui me permet de récupérer tous les pays commençant par la lettre 'm' mais pour correspondre à mes exemples ci-dessus, si je tape 'alge' en chaine de recherche il me sort 'Algérie' comme résultat.
Cette conversion fonctionne très bien sur le serveur que j'utilisais, un "PostgreSQL 8.1.3".
je suis monté en version sur un de mes serveurs de dev et cette conversion ne fonctionne plus; j'ai fait le test sur un "PostgreSQL 8.4.1" et également sur un "PostgreSQL 8.3.9"; voilà l'erreur que j'obtiens :
ERROR: function convert(character varying, unknown, unknown) does not exist
LINE 1: ...epays, devisepays FROM pays WHERE LOWER(TO_ASCII(CONVERT("n...
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
********** Erreur **********
ERROR: function convert(character varying, unknown, unknown) does not exist
État SQL :42883
Astuce : No function matches the given name and argument types. You might need to add explicit type casts.
Caractère : 78
Or la fonction convert() existe toujours et ca syntaxe semble la même.
Est ce quelqu'un aurait une idée sur la raison de cette erreur et sur la façon de la corriger ?!
Merci d'avance, Fab.
Hors ligne
Bonjour,
J'ai testé votre requête sur PostgreSQL 8.3.1 et j'ai également le message "ERROR: function convert(character varying, unknown, unknown) does not exist". Pas d'explication ...
PS: Je rajoute une question. En terme de performance faut-il mieux faire un ILIKE ou un LOWER (ou UPPER) pour faire de la recherche en case insensitive ?
Hors ligne
Ça fait partie des nouveautés de la 8.3. Comme dit dans la changelog de la version :
Adjust convert() behavior to ensure encoding validity (Andrew)
The two argument form of convert() has been removed. The three argument form now takes a bytea first argument and returns a bytea. To cover the loss of functionality, three new functions have been added:
convert_from(bytea, name) returns text -- converts the first argument from the named encoding to the database encoding
convert_to(text, name) returns bytea -- converts the first argument from the database encoding to the named encoding
length(bytea, name) returns integer -- gives the length of the first argument in characters in the named encoding
Je pense donc qu'il faut convertir nompays en bytea (tableau d'octets sans encodage). Il risque ensuite d'y avoir le problème inverse pour TO_ASCII qui a besoin de texte et pas de bytea.
Marc.
Hors ligne
ILIKE ou LOWER sont très proches en termes de performance (la différence n'est pas mesurable à ma connaissance)
Marc.
Hors ligne
Merci Marc pour ta réponse.
Je vais essayer de modifier ma requête en prenant en compte les nouvelles fonctions et si je trouve quelque chose d'intéressant je fais un retour sur ce post.
Hors ligne