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

#1 01/07/2010 11:46:46

mortimer.pw
Membre

Type de données CHARACTER

Bonjour,

Je travaille sur une 8.4.2 sous Cent-OS 5.

J'ai créé une table avec la structure suivante :

          CREATE TABLE type_action (
              id_type_action CHARACTER(3) NOT NULL,
              libelle CHARACTER VARYING(30) NOT NULL,
              id_type_operation CHARACTER(1) NOT NULL
          );
          ALTER TABLE geo.type_action OWNER TO postgres;


J'ai saisi des valeurs sur 1, 2 ou 3 caractères dans le champ ID_TYPE_ACTION.

Lorsque je fais un SELECT, je ne reçois jamais les espaces en fin sur les valeurs contenant 1 ou 2 caractères :

          select id_type_act,length(id_type_act),'--'||id_type_act||'--' from type_act;
                    RR, 2, --RR--
                    P, 1, --P--
                    QQQ,3, --QQQ--

Ne devrais-je pas obtenir :

                    RR , 3, --RR --
                    P  ,3, --P  --
                    QQQ,3, --QQQ--

Merci.

Hors ligne

#2 01/07/2010 14:30:44

Marc Cousin
Membre

Re : Type de données CHARACTER

Les blancs de padding de char ne sont pas significatifs. Quand vous utilisez l'opérateur de concaténation, ils sont supprimés.


Marc.

Hors ligne

#3 01/07/2010 15:29:15

flo
Membre

Re : Type de données CHARACTER

Qu'est-ce que tu veux dire par "non significatif"?

J'ai fait un test :

CREATE TABLE testchar
(
  id serial NOT NULL,
  truc character(5)
)
WITH (
  OIDS=FALSE
);

puis j'ai inséré des données, et notamment :

insert into testchar (truc) values ('ba   ');


tests=# select '**' || truc || '**' from testchar;

?column?
-----------
**a**
**ab**
**abc**
**abcd**
**abcde**
** bcde**
**ba**
(7 lignes)

L'espace de fin est supprimé aussi, alors que je l'avais bien mis.

C'est curieux, je n'avais jamais remarqué cela. Est-ce que c'est spécifique à PostgreSQL?

Hors ligne

#4 01/07/2010 16:06:25

gleu
Administrateur

Re : Type de données CHARACTER

non significatif == pas de sens smile

En gros, tu utilises le champ avec des opérateurs (concaténation par exemple, mais aussi comparaison), les espaces de fin sont tronqués. Par contre, si tu ne récupères que la colonne (SELECT colonne FROM...), les espaces apparaîtront qu'ils aient été ajoutés ou pas au moment de l'insertion.

Dans un varchar, ils sont significatifs. Donc ils ne sont pas ajoutés si la taille de la chaîne est inférieure à la taille du champ (pour le stockage). Ils sont aussi considérés dans les opérations de concaténation, de comparaison, etc.


Guillaume.

Hors ligne

#5 01/07/2010 17:04:54

flo
Membre

Re : Type de données CHARACTER

Ah oui, en fait comme j'avais toujours vu récupérer les valeurs dans un programme puis fait les opérations sur les chaînes, je n'avais pas pensé que cela pouvait être différent si on le faisait dans le SQL directement.

Hors ligne

Pied de page des forums