Espaces à droite dans des colonnes de type CHAR

From: philippe(dot)beaudoin(at)bull(dot)net
To: pgsql-fr-generale(at)postgresql(dot)org
Subject: Espaces à droite dans des colonnes de type CHAR
Date: 2009-01-13 07:52:19
Message-ID: OF46E2C9D5.000645B8-ONC125753D.002A650D@frcl.bull.fr
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-fr-generale

Bonjour,

Je rencontre un autre problème, cette fois avec l'utilisation de colonnes
de type CHARACTER.
La documentation (
http://www.postgresql.org/docs/8.3/static/datatype-character.html) indique
que les colonnes de type CHARACTER stockent des caractères (on s'en doute)
sur une longueur fixe, avec éventuellement padding de blancs à droite.
"If the string to be stored is shorter than the declared length, values of
type character will be space-padded"
Jusque là, tout va bien.
Mais l'exemple en bas de page me semble contradictoire avec cette
définition :
CREATE TABLE test1 (a character(4));
INSERT INTO test1 VALUES ('ok');
SELECT a, char_length(a) FROM test1; -- (1)
a | char_length
------+-------------
ok | 2
Puisque la colonne "a" fait 4 caractères, je m'attends à ce que la longueur
de ce qui est stocké, et surtout restitué, soit égale à 4 et non 2.
A ce moment, je me dis que la suppression des blancs à droite peut être
très intéressant pour gagner de la place sur disque.

Mais dans certains cas, des requêtes existantes (utilisées avec un autre
SGBD) ne fonctionnent plus, par exemple, quand un substring est utilisé de
la manière suivante.
(pg 8.3 et encodage SQL_ASCII)
postgres=> create table t1 (c1 char(10));
CREATE TABLE
postgres=> insert into t1 values ('1234567890');
INSERT 0 1
postgres=> insert into t1 values ('12345 ');
INSERT 0 1
postgres=> select c1, length(c1) from t1;
c1 | length
------------+--------
1234567890 | 10
12345 | 5
(2 rows)
postgres=> select * from t1 where substr(c1,7,2)=' ';
c1
----
(0 rows)

Comme la 2ème ligne insérée comprend 5 espaces à droite, la requête
précédente devrait la restituer.
Pour moi, ce n'est pas le SUBSTR qui ne fonctionne pas bien, mais c'est
plutôt le fait que cette colonne CHAR fonctionne un peu comme un VARCHAR.
Pour obtenir la ligne, il faut que le littéral soit de longueur nulle. Bon
après tout, il n'y a qu'à changer cette requête.
Mais ceci est génant, car le résultat dépend du contenu des caractères
suivants (car. 8 à 10 dans cet exemple). S'ils ne sont pas à espace, il
faut garder les 2 blancs dans le littéral !
Un exemple concret : prenons une colonne contenant une chaîne de caractères
représentant des indicateurs sous forme de caractères pouvant prendre
chacun la valeur espace ou autre chose. Pour obtenir le 50ème indicateur,
je peux utiliser l'expression SUBSTR(colonne,50,1). Pour tester si ce 50ème
indicateur est à espace ou non, je dois écrire la condition
SUBSTR(colonne,50,1) = ' ' ... ou bien SUBSTR(colonne,50,1) = '' (mais pas
les deux !).

Qu'en pensez-vous ? Ce fonctionnement vous semble-t'il cohérent ?

Philippe.

Responses

Browse pgsql-fr-generale by date

  From Date Subject
Next Message Daniel Verite 2009-01-13 11:36:19 Re: Espaces à droite dans des colonnes de type CHAR
Previous Message damien clochard 2009-01-12 22:26:00 Comment utilisez-vous PostgreSQL ?