8.3. Types caractères

Tableau 8-4. Types caractères

NomDescription
character varying(n), varchar(n)Longueur variable avec limite
character(n), char(n)longueur fixe, comblé avec des espaces
textlongueur variable illimitée

Tableau 8-4 montre 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 peuvent stocker des chaînes de caractères de taille inférieure ou égale à n. Une tentative d'insérer une chaîne trop longue donnera une erreur, à moins que les caractères en trop soient tous des espaces, auquel cas la chaîne sera tronquée à la taille maximale. (Cette exception un rien étrange est imposée par la norme SQL). Si la chaîne à stocker est plus petite que la taille déclarée, elle sera complétée par des espaces pour le type character, et elle sera stockée telle quelle pour le type character varying.

Si vous transtypez (cast) explicitement une valeur en character varying(n) ou en character(n), alors une chaîne trop longue sera tronquée à n caractères sans que cela génère d'erreur. (Ce comportement est aussi imposé par la norme SQL.)

Note : Avant PostgreSQL 7.2, les chaînes trop longues étaient toujours tronquées sans générer d'erreur, que ce soit par une transformation explicite ou implicite.

Les notations varchar(n) et char(n) sont des alias pour 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 toutes tailles. 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 aussi.

Les valeurs de type character sont physiquement alignées avec des espaces pour la longueur n spécifiée, et sont stockées et affichées de cette façon. Néanmoins, les espaces d'alignement sont traités sémantiquement sans signification. Les espaces en fin ne sont pas utilisés lors de la comparaison de deux valeurs de type character, et ils seront supprimés lors de la conversion d'une valeur character en un des types chaîne. Notez que les espaces en fin sont ont sémantiquement une signification pour les valeurs de type character varying et text.

L'espace de stockage utilisé pour les données de ces types est de 4 octets en plus de la taille de la chaîne, plus le remplissage dans le cas du type character. Les grandes chaînes sont automatiquement compressées par le système, si bien que l'espace effectivement utilisé peut être inférieur. Les grandes chaînes sont aussi stockées dans des tables d'arrière plan, afin de ne pas ralentir l'accès aux autres colonnes plus petites. Dans tous les cas, la taille maximale possible pour une chaîne de caractères est de l'ordre 1 Go. (La taille maximale pour n dans la déclaration de type est plus petite que cela. Il ne serait pas très utile de le changer parce qu'avec l'encodage des caractères sur plusieurs octets, le nombre de caractères et d'octets peuvent être très différents. Si vous voulez stocker de longues chaînes sans limite de taille spécifique, utilisez le type text ou le type character varying sans indiquer de taille, plutôt que d'indiquer une limite de taille arbitraire.)

Astuce : Il n'y a pas de différence de performance entre ces trois types, à part la place disque supplémentaire pour le type qui remplit les vides avec des espaces. Bien que character(n) a des avantages en terme de performance dans 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 ou character varying devraient être utilisés à leur place.

Voir Section 4.1.2.1 pour avoir plus d'informations sur la syntaxe des littéraux de chaînes, et Chapitre 9 pour avoir des informations sur les opérateurs et les fonctions. L'ensemble de caractères de la base de données détermine l'ensemble de caractères utilisé pour stocker les valeurs texte ; pour plus d'informations sur le support des ensembles de caractères, référez-vous à Section 20.2.

Exemple 8-1. Utilisation des types caractères

CREATE TABLE test1 (a character(4));
INSERT INTO test1 VALUES ('ok');
SELECT a, char_length(a) FROM test1; -- (1)
  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
(1)
La fonction char_length est décrite dans Section 9.4.

Il y a deux autres types caractères de taille constante dans PostgreSQL, décrits dans Tableau 8-5. Le type name existe seulement 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 pourrait changer dans une prochaine version. Le type "char" (notez les 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

NomTaille de stockageDescription
"char"1 octettype interne de 1 caractère
name64 octetstype interne pour les noms d'objets