8.3. Types de caractères

Tableau 8-4. Types de caractères

Nom Description
caractère variant(n), varchar(n) longueur variable avec limite
caractère(n), char(n) longueur fixe, remplissage de blanc
texte variable longueur illimitée

Le tableau8-4 montre les types de caractères à usage général disponibles dansPostgreSQL.

SQL définit deux types de caractères primaires : caractère variant(n) et caractère(n), oùen est un entier positif. Ces deux types peuvent stocker des chaînes de caractères d’une longueur maximale de n caractères (pas d’octets). Toute tentative de stockage d’une chaîne plus longue dans une colonne de ces types entraînera une erreur, sauf si les caractères excédentaires sont tous des espaces, auquel cas la chaîne sera tronquée à la longueur maximale (cette exception quelque peu bizarre est requise par la norme SQL).) Si la chaîne de caractères à stocker est plus courte que la longueur déclarée, les valeurs de type character seront remplies d’espaces ; les valeurs de typecharacter varying stockeront simplement la chaîne de caractères plus courte.

Si l’on jette explicitement une valeur sur charactervarying(n) ou character(n), alors une valeur de longueur excessive sera tronquée à n caractères sans soulever d’erreur. (Thistoo est requis par le SQLstandard.)

Les notations varchar(n) et char(n) sont des alias pour charactervarying(n)et character(n), respectivement. character sans spécification de longueur est équivalent àcharacter(1). Si charactervarying est utilisé sans spécificateur de longueur, le type accepte les chaînes de caractères de n’importe quelle taille. Ce dernier est une extension PostgreSQL.

En outre, PostgreSQLpropose le type text, qui stocke des chaînes de caractères de toute longueur. Bien que le type texte ne soit pas dans le standard SQL, plusieurs autres systèmes de gestion de base de données SQL le possèdent également.

Les valeurs du type caractère sont physiquementpadded avec des espaces à la largeur spécifiée n, et sont stockées et affichées de cette façon.Cependant, les espaces de padding sont traités comme sémantiquementinsignifiants. Les espaces de fin ne sont pas pris en compte lors de la comparaison de deux valeurs de type caractère, et ils seront supprimés lors de la conversion d’une valeur de caractère en l’un des autres types de chaîne. Notez que les espaces de fin sont sémantiquement significatifs dans les valeurs variables de caractères et de textes, et lors de l’utilisation de la correspondance de motifs, par exemple LIKE, les expressions régulières.

Les besoins de stockage pour une chaîne courte (jusqu’à 126 octets) sont de 1 octet plus la chaîne réelle, qui comprend le remplissage d’espace dans le cas du caractère. Les chaînes plus longues ont 4 octets de surcharge au lieu de 1. Les chaînes longues sont compressées automatiquement par le système, de sorte que l’exigence physique sur le disque pourrait être moindre. Les valeurs très longues sont également stockées dans des tables d’arrière-plan afin qu’elles n’interfèrent pas avec l’accès rapide aux valeurs de colonnes plus courtes.Quoi qu’il en soit, la plus longue chaîne de caractères possible qui peut être stockée est d’environ 1 Go. (La valeur maximale qui sera autorisée pour n dans la déclaration du type de données est inférieure à cela. Il ne serait pas utile de changer cela car avec les codages de caractères multi-octets, le nombre de caractères et d’octets peut être très différent. Si vous souhaitez stocker de longues chaînes de caractères sans limite supérieure spécifique, utilisez du texte ou des caractères variables sans spécification de longueur, plutôt que d’inventer une limite de longueur arbitraire.)

Tip : Il n’y a pas de différence de performance entre ces trois types, en dehors de l’espace de stockage accru lors de l’utilisation du typeblank-padded, et de quelques cycles CPU supplémentaires pour vérifier la longueur lors du stockage dans une colonne à contrainte de longueur. Alors que character(n) a des avantages de performance dans certains autres systèmes de base de données, il n’y a pas d’avantage de ce type dans PostgreSQL ; en fait, character(n) est généralement le plus lent des trois à cause de ses coûts de stockage supplémentaires. Dans la plupart des situations, le texte ou le charactervarying devrait être utilisé à la place.

Référez-vous à la Section 4.1.2.1 pour des informations sur la syntaxe des littéraux de chaîne de caractères, et auChapitre 9 pour des informations sur les opérateurs et fonctions disponibles. Le jeu de caractères de la base de donnéesdétermine le jeu de caractères utilisé pour stocker les valeurs textuelles ; pour plus d’informations sur la prise en charge des jeux de caractères, reportez-vous à la Section 22.3.

Exemple 8-1. Utilisation des types de 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 | 2CREATE TABLE test2 (b varchar(5));INSERT INTO test2 VALUES ('ok');INSERT INTO test2 VALUES ('good ');INSERT INTO test2 VALUES ('too long');ERROR: value too long for type character varying(5)INSERT INTO test2 VALUES ('too long'::varchar(5)); -- explicit truncationSELECT b, char_length(b) FROM test2; b | char_length-------+------------- ok | 2 good | 5 too l | 5
(1) La fonction char_length est discutée dans la Section 9.4.

Il existe deux autres types de caractères de longueur fixe dans PostgreSQL, présentés dans le Tableau8-5. Le type nom existe uniquement pour le stockage des identifiants dans les catalogues internes du système et n’est pas destiné à être utilisé par l’utilisateur général. Sa longueur est actuellement définie comme étant de 64 octets (63 caractères utilisables plus le terminateur) mais doit être référencée en utilisant la constante NAMEDATALEN dans le code source C. La longueur est définie au moment de la compilation (et est donc ajustable pour des utilisations spéciales) ; la longueur maximale par défaut pourrait changer dans une prochaine version. Le type “char” (notez les guillemets) est différent de char(1) en ce qu’il n’utilise qu’un seul octet de stockage. Il est utilisé en interne dans les catalogues système comme un type énumération simpliste.

Tableau 8-5. Types de caractères spéciaux

Nom Taille de stockage Description
“char” 1 byte single-byte type interne
nom 64 bytes type interne pour les noms d’objets

.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.