8.3. Types caractère
Tableau 8.4. Types caractère
|
Nom
|
Description
|
|
character varying(
n
), varchar(
n
)
|
Longueur variable avec limite
|
|
character(
n
), char(
n
)
|
longueur fixe, complété par des espaces
|
|
text
|
longueur variable illimitée
|
Le Tableau 8.4,
« Types caractère » présente les types génériques
disponibles dans PostgreSQL™.
SQL définit deux types de
caractères principaux : character
varying(
n
) et
character(
n
) où
n
est un entier positif. Ces deux types
permettent de stocker des chaînes de caractères de taille inférieure
ou égale à
n
. Toute tentative
d'insértion d'une chaîne plus longue conduit à une erreur, à moins
que les caractères en excès ne soient tous des espaces, auquel cas la
chaîne est tronquée à la taille maximale (cette exception étrange est
imposée par la norme SQL). Si la
chaîne à stocker est plus petite que la taille déclarée, les valeurs
de type character sont complétées par des
espaces, celles de type character varying
sont stockées en l'état.
Si une valeur est explicitement transtypée en character varying(
n
) ou en character(
n
), une
valeur trop longue est tronquée à
n
caractères sans qu'aucune erreur ne
soit levée (ce comportement est aussi imposé par la norme
SQL.)
Les notations varchar(
n
) et char(
n
) sont des
alias de character varying(
n
) et character(
n
),
respectivement. character sans indication
de taille est équivalent à character(1). Si
character varying est utilisé sans
indicateur de taille, le type accepte des chaînes de toute taille. Il
s'agit là d'une spécificité de PostgreSQL™.
De plus, PostgreSQL™ propose
aussi le type text, qui permet de stocker
des chaînes de n'importe quelle taille. Bien que le type text ne soit pas dans le standard SQL, plusieurs autres systèmes de gestion de
bases de données SQL le proposent également.
Les valeurs de type character sont
complétées physiquement à l'aide d'espaces pour atteindre la longueur
n
indiquée. Ces valeurs sont
également stockées et affichées de cette façon. Les espaces de
remplissage n'ont, toutefois, aucune signification sémantique. Les
espaces finales sont ignorées lors de la comparaison de deux valeurs
de type character et sont supprimées lors
de la conversion d'une valeur character en
un des autres types chaîne. Ces espaces
ont
une signification sémantique pour les
valeurs de type character varying et
text.
L'espace de stockage utilisé pour les données de ces types est de
quatre octets en plus de la taille de la chaîne, plus le remplissage
dans le cas du type character. Les chaînes
longues sont automatiquement compressées par le système, si bien que
l'espace effectivement utilisé peut être inférieur. Les chaînes
longues sont, de plus, stockées dans des tables d'arrière-plan, afin
de ne pas ralentir l'accès aux valeurs plus petites de la colonne.
Dans tous les cas, la taille maximale possible pour une chaîne de
caractères est de l'ordre de 1 Go. (La taille maximale pour
n
dans la déclaration de type
est inférieure. Il ne sert à rien de modifier ce comportement, car
avec les encodages sur plusieurs octets, les nombres de caractères et
d'octets peuvent être très différents. Pour stocker de longues
chaînes sans limite supérieure précise, il est préférable d'utiliser
les types text et character varying sans taille, plutôt que d'indiquer
une limite de taille arbitraire.)
Astuce
Il n'y a aucune différence de performance entre ces trois types,
si ce n'est la place disque supplémentaire requise pour le type à
remplissage. Bien que character(
n
) ait des avantages en terme
de performance sur certains autres systèmes de bases de données,
il ne dispose pas de ce type d'avantages dans PostgreSQL™. Dans la plupart des
situations, les types text et
character varying peuvent être utilisés
à leur place.
On peut se référer à la Section 4.1.2.1,
« Constantes de chaînes » pour obtenir plus
d'informations sur la syntaxe des libellés de chaînes, et le
Chapitre 9,
Fonctions et opérateurs pour des informations complémentaires sur
les opérateurs et les fonctions. Le jeu de caractères de la base de
données détermine celui utilisé pour stocker les valeurs texte ; pour
plus d'informations sur le support des jeux de caractères, se référer
à la Section 21.2,
« Support des jeux de caractères ».
Exemple 8.1. Utilisation des types caractère
CREATE TABLE test1 (a character(4));
INSERT INTO test1 VALUES ('ok');
SELECT a, char_length(a) FROM test1; --
a | char_length
------+-------------
ok | 2
CREATE TABLE test2 (b varchar(5));
INSERT INTO test2 VALUES ('ok');
INSERT INTO test2 VALUES ('bien ');
INSERT INTO test2 VALUES ('trop long');
ERROR: value too long for type character varying(5)
INSERT INTO test2 VALUES ('trop long'::varchar(5)); -- troncature explicite
SELECT b, char_length(b) FROM test2;
b | char_length
-------+-------------
ok | 2
bien | 5
trop | 5
Il y a deux autres types caractère de taille fixe dans PostgreSQL™. Ils sont décrits dans le
Tableau 8.5,
« Types caractères spéciaux ». Le type name existe
uniquement
pour le stockage des
identifiants dans les catalogues systèmes et n'est pas destiné à être
utilisé par les utilisateurs normaux. Sa taille est actuellement
définie à 64 octets (63 utilisables plus le terminateur) mais doit
être référencée en utilisant la constante NAMEDATALEN. La taille est définie à la compilation
(et est donc ajustable pour des besoins particuliers). La taille
maximale par défaut peut éventuellement être modifiée dans une
prochaine version. Le type "char"
(attention aux guillemets) est différent de char(1) car il n'utilise qu'un seul octet de stockage.
Il est utilisé dans les catalogues systèmes comme un type
d'énumération économique.
Tableau 8.5. Types caractères spéciaux
|
Nom
|
Taille de stockage
|
Description
|
|
"char"
|
1 octet
|
type interne de 1 caractère
|
|
name
|
64 octets
|
type interne pour les noms d'objets
|