PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

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

#1 18/01/2017 10:33:29

Collation Case Insensitive

Bonjour,

Je dois créer un DB case insensitive (pour des strings avec des accents (ENCODING = LATIN9 si je comprends bien) mais je n'y vois pas très clair pour ce que je dois mettre pour
- COLLATION
- CHARACTER TYPE

Comme je suis très pressé (et mon patron encore plus), je me permets d'appeler à l'aide.

Merci pour votre attention

Hors ligne

#2 18/01/2017 11:22:19

Marc Cousin
Membre

Re : Collation Case Insensitive

Bonjour,

Pour avoir des champs case insensitive dans PostgreSQL, on ne modifie pas la collation (je présume que vous venez de SQL Server ?). Avec PostgreSQL, soit on fait comme sous Oracle (on requête sur lower ou upper des chaînes et on crée des index sur lower et upper de ces chaînes au besoin), soit on utilise l'extension citext, qui fournit un nouveau type citext. Si vous avez installé les «contribs», cela se fait assez simplement:

CREATE EXTENSION citext;
CREATE TABLE ma_table ( a int, b citext)…

Si vous avez besoin de donner des limites de taille à vos champs citext, il faut rajouter des contraintes check. Par exemple:

CREATE TABLE test (a citext CHECK (length(a) < 50));

Dernière modification par Marc Cousin (18/01/2017 11:23:04)

Hors ligne

#3 18/01/2017 11:58:59

Re : Collation Case Insensitive

Merci ! Ca marche !

Encore une petite question : pourquoi dois-je écrire :
   alter table "a" alter column "c" type citext;
et non
   alter table a alter column c type citext; 

Est-ce dû à la collation ?

Peut-on se passer de ces " ?

Hors ligne

#4 18/01/2017 12:02:03

Marc Cousin
Membre

Re : Collation Case Insensitive

Vous n'avez pas besoin des " " normalement… tant que les noms des objets sont bien en minuscule dans le catalogue

Hors ligne

#5 18/01/2017 12:17:49

Re : Collation Case Insensitive

Tel n'est pas le cas !

J'ai créé ma db pg à partir d'une bd access au moyen de Bullzip.

Est-il possible de faire que les noms d'objets soient CI afin d'éviter de mettre des " dans les queries ?

Hors ligne

#6 18/01/2017 12:22:10

Marc Cousin
Membre

Re : Collation Case Insensitive

oui: créez les objets en minuscule, et vous n'aurez plus à mettre de "" autour.

Hors ligne

#7 18/01/2017 12:24:21

Re : Collation Case Insensitive

Merci pour votre attention.

Mais ce n'est pas moi qui ai créé les objets, c'est la bd access existante et je ne vois pas d'options dans Bullzip qui me permettrait de mettre les noms d'objets en minuscules

Hors ligne

#8 18/01/2017 12:25:02

Marc Cousin
Membre

Re : Collation Case Insensitive

Alors pas de solution…

Hors ligne

#9 18/01/2017 13:51:03

Re : Collation Case Insensitive

Pas de solution !?

Si on joue le résultat de

select
        'alter table "' || table_name || '" rename to "' || lower(table_name) || '";'
from
        information_schema.tables
where   
        table_schema = 'public'
order by
        table_schema,table_name;

en ensuite, on joue le résultat de

select
        'alter table ' || c.table_name || ' rename column "' ||  c.column_name || '" to "' || lower(c.column_name) || '";'
from
        information_schema.columns c
inner join
        information_schema.tables t
on
        c.table_name = t.table_name
where
        t.table_schema = 'public';

ne pensez-vous pas, alors, que le problème est résolu ?

Hors ligne

#10 18/01/2017 14:36:14

Marc Cousin
Membre

Re : Collation Case Insensitive

Pas de solution sans renommer les tables et colonnes, j'entendais. Ça rendra probablement votre logiciel inutilisable de faire ces changements de noms.

Hors ligne

#11 18/01/2017 16:16:11

Re : Collation Case Insensitive

Je vous envoie le script complet pour vous remercier;

#
# convert all tables and columns of a dd to lower case
#

psql contacts_test -U postgres -t > RenTables.sql <<EOF
select 
        'alter table "' || table_name || '" rename to "' || lower(table_name) || '";'
from 
        information_schema.tables
where   
        table_schema = 'public'
order by 
        table_schema,table_name;
EOF

psql contacts_test -U postgres  -f RenTables.sql

psql contacts_test -U postgres -t > RenColumns.sql <<EOF
select
        'alter table ' || c.table_name || ' rename column "' ||  c.column_name || '" to "' || lower(c.column_name) || '";'
from 
        information_schema.columns c
inner join
        information_schema.tables t
on
        c.table_name = t.table_name
where   
        t.table_schema = 'public';
EOF

psql contacts_test -U postgres -f RenColumns.sql

Vive PostgreSQL !

Hors ligne

#12 18/01/2017 16:18:24

Marc Cousin
Membre

Re : Collation Case Insensitive

Bon, juste pour pinailler, ça ne va pas marcher si vous avez des double quotes dans les noms de tables ou de colonnes smile. Pour éviter le problème, on a une fonction qui s'appelle quote_ident()

Hors ligne

#13 18/01/2017 17:16:06

Re : Collation Case Insensitive

mettre des double quotes dans des noms de variables ?

drôle d'idée ;-)

on fait des trucs comme ça chez Dalibo ?

Hors ligne

#14 18/01/2017 17:16:49

Marc Cousin
Membre

Re : Collation Case Insensitive

Non, on fait pas. Mais on prévoit que les utilisateurs peuvent le faire… on en a bien un qui a voulu appeler une table $0 hier… smile

Hors ligne

#15 18/01/2017 17:57:33

Re : Collation Case Insensitive

$0 ! pas mal...

tant que j'ai un spécialiste en ligne...

j'ai persuadé mon patron de passer d'Access à PostgreSQL

mais pour le front-end ?

on peut garder Access

pensez-vous que Base de LibreOffice est assez puissant ?

et pour faire des forms en web, quel outil conseilleriez vous ?

Hors ligne

#16 19/01/2017 00:24:44

Marc Cousin
Membre

Re : Collation Case Insensitive

Pour le frontend aucune idée… j'imagine qu'on peut continuer à utiliser access au travers d'odbc. Je n'ai pas d'expérience sur la partie frontemd. Si quelqu'un d'autre s'y connait, qu'il n'hésite pas…

Hors ligne

Pied de page des forums