

Tableau 8.4. Types caractère
| Nom | Description | 
|---|---|
| character varying(,varchar( | Longueur variable avec limite | 
| character(,char(,bpchar( | longueur fixe, complété par des espaces | 
| bpchar | longueur variable illimitée, complété par des espaces | 
| text | longueur variable illimitée | 
Le Tableau 8.4 présente les types génériques disponibles dans PostgreSQL.
    SQL définit deux types de caractères principaux :
    character varying( et
    n)character( où n)n
    est un entier positif.
    Ces deux types permettent de stocker des chaînes de caractères de taille
    inférieure ou égale à n (ce ne sont pas des octets).
    Toute tentative
    d'insertion 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).
    Néanmoins, si un utilisateur convertit explicitement une valeur en
    character varying( ou
    n)character(, alors toute valeur
    trop longue sera tronquée à n)n caractères sans
    retourner d'erreur. (Ceci est aussi requis par le standard
    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.
   
    De plus, PostgreSQL fournit le type
    text qui enregistre des chaînes de toute longueur. Bien que
    text ne fasse pas partie du standard SQL,
    plusieurs autres systèmes de gestion de bases de données SQL en disposent
    eux-aussi.
    text est le type de données chaîne natif de
    PostgreSQL dans le sens où la plupart des
    fonctions internes opérant sur des chaînes sont déclarées comme prenant
    ou renvoyant du text, et non pas du character
    varying. Dans de nombreux cas, character varying
    agit comme un domaine pour le
    type text.
   
    Le nom de type varchar est un alias pour character
    varying, alors que bpchar (avec une indication de
    taille) et char sont des alias pour character.
    Les varchar et char sont définis dans le standard
    SQL ; bpchar est une extension de
    PostgreSQL.
   
    Si indiqué, la longueur n doit être supérieure à
    zéro et ne peut pas dépasser 10485760.  Si character varying
    (ou varchar) est utilisé sans indication de longueur, le type
    accepte les chaînes de toute taille.  Si bpchar ne précise pas
    de longueur, il accepte aussi les chaînes de toute taille, mais les espaces
    en fin sont sémantiquement insignifiants.  Si character (ou
    char) n'indique pas de longueur, c'est équivalent à
    character(1).
   
    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.
    Cependant, les espaces de remplissage sont traités comme sémantiquement non
    significatifs et sont donc ignorés lors de la comparaison de deux valeurs
    de type character.  Dans les collationnements où les espaces
    de remplissage sont significatifs, ce comportement peut produire des
    résultats inattendus, par exemple SELECT 'a '::CHAR(2) collate "C" <
     E'a\n'::CHAR(2) retourne vrai, même si la locale
    C considérerait qu'un espace est plus grand qu'un
    retour chariot. Les espaces de remplissage  sont supprimés lors de la
    conversion d'une valeur character vers l'un des autres types
    chaîne.  Ces espaces ont une signification sémantique
    pour les valeurs de type character varying et
    text, et lors de l'utilisation de la correspondance de
    motifs, par exemple avec LIKE ou avec les expressions
    rationnelles.
   
Les caractères pouvant être enregistrés dans chacun de ces types de données sont déterminés par le jeu de caractères de la base de données, qui a été sélectionné à la création de la base. Quelque soit le jeu de caractères spécifique, le caractère de code zéro (quelque fois appelé NUL) ne peut être enregistré. Pour plus d'informations, voir Section 23.3.
    L'espace nécessaire pour une chaîne de caractères courte (jusqu'à 126 octets)
    est de un octet, plus la taille de la chaîne qui inclut le remplissage avec
    des espaces dans le cas du type character. Les chaînes plus
    longues ont quatre octets d'en-tête au lieu d'un seul. Les chaînes longues
    sont automatiquement compressées par le système, donc le besoin pourrait
    être moindre. Les chaînes vraiment très longues sont stockées dans des
    tables supplémentaires, pour qu'elles n'empêchent pas d'accéder rapidement
    à des valeurs plus courtes.
    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.)
   
     Il n'y a aucune différence de performance parmi ces trois types, si ce
     n'est la place disque supplémentaire requise pour le type à remplissage
     et quelques cycles CPU supplémentaires pour vérifier la longueur lors du
     stockage dans une colonne contrainte par la taille. Bien que
     character( ait des avantages en
     termes de performance sur certains autres systèmes de bases de données, il
     ne dispose pas de ce type d'avantages dans
     PostgreSQL ; en fait,
     n)character( est habituellement le
     plus lent des trois à cause des coûts de stockage supplémentaires. Dans la
     plupart des situations, les types n)text et character
      varying peuvent être utilisés à leur place.
    
On peut se référer à la Section 4.1.2.1 pour obtenir plus d'informations sur la syntaxe des libellés de chaînes, et le Chapitre 9 pour des informations complémentaires sur les opérateurs et les fonctions.
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; -- (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
| 
       La fonction  | 
    Il y a deux autres types caractère de taille fixe dans
    PostgreSQL. Ils sont décrits dans le Tableau 8.5.
    Ils ne sont pas destinés à une utilisation générale, mais seulement
    par les catalogues systèmes internes.
    Le type name est utilisé pour le stockage des identifiants.
    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 en code source
    C. 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 et, de ce fait ne peut stocker qu'un seul caractère ASCII.
    Il est utilisé dans les catalogues système comme un type
    d'énumération simpliste.
   
Tableau 8.5. Types caractères spéciaux
| Nom | Taille de stockage | Description | 
|---|---|---|
| "char" | 1 octet | type interne d'un octet | 
| name | 64 octets | type interne pour les noms d'objets |