1

J'essaie de faire en sorte que PostgreSQL 8.4.3 fasse une correspondance insensible à la casse avec son opérateur ~* lorsque les chaînes contiennent des caractères non-ASCII comme les trémas allemands. La base de données, le terminal et tout le reste sont configurés pour utiliser UTF-8.Comment utiliser la correspondance insensible à la casse avec PostgreSQL et Umlauts?

est ici le problème en quelques mots:

SELECT 'Ö' ~* 'ö';  -- false 

Il existe d'autres variantes qui font un travail:

SELECT 'Ö' ILIKE 'ö';  -- true 
SELECT 'Ö' ~* '[Öö]';  -- true 
SELECT LOWER('Ö') ~* 'ö'; -- true 

Aucune de ces alternatives me rendent particulièrement heureux. ILIKE n'utilise pas d'expressions régulières. [Öö] implique de réécrire le terme de recherche. LOWER() est probablement la meilleure solution de contournement, mais j'aimerais vraiment que l'opérateur ~* fonctionne comme il le devrait.

Merci d'avance.

+0

Il y a un problème lié avec les trémas et les limites de mots. Par exemple, le modèle '\ möl' ne correspondra pas à la chaîne 'öl'. – Zilk

Répondre

3

Il s'agit d'un bogue dans les versions de PostgreSQL antérieures à 9.0.
Il est dans le changelog 9.0: http://www.postgresql.org/docs/9.0/static/release-9-0.html#AEN99075

Voici mon test de la version 9.0 beta2 utilisant Ubuntu:

SELECT 'Ö' ~* 'ö'; 
?column? 
---------- 
t 
(1 row) 
+0

Merci, j'ai raté celui-là –

+0

Merci, ça l'explique maintenant, je peux au moins arrêter de chercher des problèmes avec notre installation. – Zilk

1

j'obtiens vrai avec cette requête:

SELECT 'Ö' ~* 'ö'; -- true 

Mais je ne version 9.0beta2 utilisation à OS X 10.5.8 avec ces paramètres:

CREATE DATABASE test 
    WITH OWNER = postgres 
     ENCODING = 'UTF8' 
     TABLESPACE = pg_default 
     LC_COLLATE = 'nl_NL.UTF-8' 
     LC_CTYPE = 'nl_NL.UTF-8' 
     CONNECTION LIMIT = -1; 

Edit: Même résultat sur la version 8.3. 7. On dirait que vous avez un problème avec l'encodage.

+0

Très intéressant, merci de vérifier. Je n'arrive pas à faire ça n'importe où. Mon serveur db local (v8.3.9 sur Ubuntu 8.10) ne me laisse pas spécifier LC_COLLATE ou LC_CTYPE dans l'instruction CREATE DATABASE. Je pense que ceux-ci ont été ajoutés en 8.4. Sans eux, les résultats dans la nouvelle base de données sont les mêmes. Le db sur le serveur (v8.4.3 sur Ubuntu 10.04) m'a demandé de spécifier TEMPLATE = template0 avant de pouvoir créer une base de données avec les locales 'nl_NL.UTF-8', mais même ainsi, le résultat était toujours le même (pas de correspondance). – Zilk

+0

Hmmm, je reçois aussi un FAUX sur Ubuntu 9.10, PostgreSQL 8.4.4. (VM fonctionnant sous OS X). Je suppose que cela a quelque chose à voir avec innitdb quand le db-cluster est créé. Jetez-y un coup d'œil et/ou envoyez un message à la liste de diffusion pgsql. –

+0

Vous avez FALSE aussi avec 8.4.3 sur Fedora 12. (init cluster avec LATIN9, mais il m'a permis de créer la base de données en spécifiant 'TEMPLATE = template0;' – leonbloy