Vous n'êtes pas identifié(e).

#1 20/01/2010 14:46:23

fab2b
Membre

Pb d'utilisation de CONVERT() sur serveur 8.3. et plus

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

#2 20/01/2010 15:32:17

cafu3
Membre

Re : Pb d'utilisation de CONVERT() sur serveur 8.3. et plus

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

#3 20/01/2010 15:34:30

Marc Cousin
Membre

Re : Pb d'utilisation de CONVERT() sur serveur 8.3. et plus

Ç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

#4 20/01/2010 15:35:35

Marc Cousin
Membre

Re : Pb d'utilisation de CONVERT() sur serveur 8.3. et plus

ILIKE ou LOWER sont très proches en termes de performance (la différence n'est pas mesurable à ma connaissance)


Marc.

Hors ligne

#5 20/01/2010 16:12:34

fab2b
Membre

Re : Pb d'utilisation de CONVERT() sur serveur 8.3. et plus

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

Pied de page des forums