8.4. Types de données binaires
Le type de données bytea permet de stocker
des chaînes binaires ; voir le Tableau 8.6,
« Types de données binaires ».
Tableau 8.6. Types de données binaires
|
Nom
|
Espace de stockage
|
Description
|
|
bytea
|
4 octets plus la taille de la chaîne binaire à stocker
|
Chaîne binaire de longueur variable
|
Une chaîne binaire est une séquence d'octets. Les chaînes binaires se
distinguent des chaînes de caractères par deux caractéristiques :
tout d'abord, les chaînes binaires permettent de stocker des octets
de valeurs zéro ainsi que les autres caractères « non imprimables » (habituellement, les octets en
dehors de l'échelle de 32 à 126). Les chaînes de caractères
interdisent les octets de valeur zéro et interdisent aussi toute
valeur d'octet ou séquence d'octets invalide selon l'encodage
sélectionné pour la base de données. Ensuite, les opérations sur les
chaînes binaires traitent réellement les octets alors que le
traitement de chaînes de caractères dépend de la configuration de la
locale. En résumé, les chaînes binaires sont appropriées pour le
stockage de données que le développeur considère comme des
« octets bruts » alors que les
chaînes de caractères sont appropriées pour le stockage de texte.
Lors de la saisie de valeurs de type bytea,
les octets d'une certaine valeur
doivent
être échappés (mais toutes les
valeurs
peuvent
l'être)
lorsqu'ils appartiennent à une chaîne littérale au sein d'une
commande SQL. En général, pour
échapper un octet, il faut le convertir en nombre octal sur 3
caractères, correspondant à sa valeur décimale, et le faire précédé
de deux antislashs. Le Tableau 8.7,
« Octets littéraux bytea à
échapper » affiche les caractères qui doivent être échappés,
et donne les séquences d'échappement possibles.
Tableau 8.7. Octets littéraux bytea à échapper
|
Valeur décimale de l'octet
|
Description
|
Représentation échappée en entrée
|
Exemple
|
Représentation en sortie
|
|
0
|
octet zéro
|
E'\\000'
|
SELECT E'\\000'::bytea;
|
\000
|
|
39
|
apostrophe
|
'''' or E'\\047'
|
SELECT E'\''::bytea;
|
'
|
|
92
|
antislash
|
E'\\\\' or E'\\134'
|
SELECT E'\\\\'::bytea;
|
\\
|
|
de 0 à 31 et de 127 à 255
|
octets « non
affichables »
|
E'\\
xxx'
(octal value)
|
SELECT E'\\001'::bytea;
|
\001
|
La nécessité d'échapper les octets « non
affichables » dépend des paramétrages de la locale. Il
est parfois possible de s'en sortir sans échappement. Le résultat de
chacun des exemples du Tableau 8.7,
« Octets littéraux bytea à
échapper » fait exactement un octet, même si la
représentation en sortie de l'octet zéro et de l'antislash font plus
d'un caractère.
S'il faut écrire tant d'antislashs, comme indiqué dans le Tableau 8.7,
« Octets littéraux bytea à
échapper », c'est qu'une chaîne binaire doit passer à
travers deux phases d'analyse dans le serveur PostgreSQL™. Le premier antislash de
chaque paire est vu comme un caractère d'échappement par l'analyseur
de chaîne (en supposant que la syntaxe d'échappement des chaînes soit
utilisée) et est donc consommé, laissant le second antislash de la
paire. (Les chaînes à guillemets dollar peuvent être utilisées pour
éviter ce niveau d'échappement.) L'antislash restant est compris par
la fonction d'entrée de PostgreSQL™ comme le début d'une valeur
octale sur trois caractères ou comme l'échappement d'un autre
antislash. Par exemple, une chaîne littérale passée au serveur comme
E'\\001' devient \001 après être passée au travers de l'analyseur
d'échappement de chaîne. Le \001 est envoyé
à la fonction d'entrée de bytea, qui le
convertit en un octet simple ayant une valeur décimale de 1. Le
guillemet simple n'est pas traité spécialement par bytea et suit les règles normales des chaînes
littérales de chaîne. Voir aussi la Section 4.1.2.1,
« Constantes de chaînes ».
Les octets de bytea sont également échappés
en sortie. En général, tout octet « non-imprimable » est converti en son équivalent
octal sur trois caractères et précédé d'un antislash. La plupart des
caractères « imprimables » sont
affichés avec leur représentation standard dans le jeu de caractères
du client. Les octets de valeur décimale 92 (antislash) ont une
représentation spéciale. Les détails sont dans le Tableau 8.8,
« Octets échappés en sortie pour bytea ».
Tableau 8.8. Octets échappés en sortie pour
bytea
|
Valeur décimale de l'octet
|
Description
|
Représentation de sortie échappée
|
Exemple
|
Résultat en sortie
|
|
92
|
antislash
|
\\
|
SELECT E'\\134'::bytea;
|
\\
|
|
0 à 31 et 127 à 255
|
octets« non
affichables »
|
\
xxx
(valeur octale)
|
SELECT E'\\001'::bytea;
|
\001
|
|
32 à 126
|
octets « affichables »
|
Représentation dans le jeu de caractères du client
|
SELECT E'\\176'::bytea;
|
~
|
En fonction de l'interface utilisée pour accéder à PostgreSQL™, un travail supplémentaire
d'échappement/de « déséchappement » des chaînes bytea peut être nécessaire. Il faut également échapper
les sauts de lignes et retours à la ligne si l'interface les traduit
automatiquement, par exemple.
Le standard SQL définit un type
binaire différent, appelé BLOB ou
BINARY LARGE OBJECT. Le format d'entrée est
différent de celui du bytea mais les
fonctions et opérateurs fournis sont globalement les mêmes.