Vous n'êtes pas identifié(e).
Pages : 1
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
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)
Marc.
Hors ligne
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
Vous n'avez pas besoin des " " normalement… tant que les noms des objets sont bien en minuscule dans le catalogue
Marc.
Hors ligne
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
oui: créez les objets en minuscule, et vous n'aurez plus à mettre de "" autour.
Marc.
Hors ligne
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
Alors pas de solution…
Marc.
Hors ligne
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
Pas de solution sans renommer les tables et colonnes, j'entendais. Ça rendra probablement votre logiciel inutilisable de faire ces changements de noms.
Marc.
Hors ligne
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
Bon, juste pour pinailler, ça ne va pas marcher si vous avez des double quotes dans les noms de tables ou de colonnes . Pour éviter le problème, on a une fonction qui s'appelle quote_ident()
Marc.
Hors ligne
mettre des double quotes dans des noms de variables ?
drôle d'idée ;-)
on fait des trucs comme ça chez Dalibo ?
Hors ligne
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…
Marc.
Hors ligne
$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
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…
Marc.
Hors ligne
Pages : 1