IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)

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 un � quatre 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 de deux fa�ons : 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.

Le type bytea supporte deux formats externes pour l'entr�e et la sortie : le format d'�chappement (� escape �) historique de PostgreSQL™ et le format hexad�cimal (� hex �). Les deux sont accept�s en entr�e. Le format de sortie d�pend du param�tre de configuration bytea_output ; ce dernier s�lectionne par d�faut le format hexad�cimal. (Notez que le format hexad�cimal est disponible depuis PostgreSQL™ 9.0 ; les versions ant�rieures et certains outils ne le comprennent pas.)

Le standard SQL d�finit un type de cha�ne binaire diff�rent, appel� BLOB ou BINARY LARGE OBJECT. Le format en entr�e est diff�rent du bytea, mais les fonctions et op�rateurs fournis sont pratiquement les m�mes.

8.4.1. Le format hexad�cimal bytea

Le format � hex � code les donn�es binaires sous la forme de deux chiffres hexad�cimaux par octet, le plus significatif en premier. La cha�ne compl�te est pr�c�d�e par la s�quence \x (pour la distinguer du format d'�chappement). Dans la majorit� des cas (exactement les m�mes pour lesquelles les antislashs sont doubl�s dans le format d'�chappement), l'antislash initial peut avoir besoin d'�tre �chapp� par un doublage du caract�re ; les d�tails sont disponibles plus bas. Les chiffres hexad�cimaux peuvent �tre soit en majuscule, soit en minuscule, et les espaces blancs sont permis entre les paires de chiffres (mais pas � l'int�rieur d'une paire ni dans la s�quence \x de d�but). Le format hexad�cimal est compatible avec une grande vari�t� d'applications et de protocoles externes, et il a tendance � �tre plus rapide � convertir que le format d'�chappement. Son utilisation est donc pr�f�r�e.

Exemple :

SELECT E'\\xDEADBEEF';

8.4.2. Le format d'�chappement bytea

Le format d'�chappement (� escape �) est le format traditionnel de PostgreSQL™ pour le type bytea. Son approche est de repr�senter une cha�ne binaire comme un s�quence de caract�res ASCII et de convertir les donn�es qui ne peuvent pas �tre repr�sent�s en ASCII en une s�quence sp�ciale d'�chappement. Si, du point de vue de l'application, repr�senter les octets sous la forme de caract�res revet un sens, alors cette repr�sentation est int�ressante. En pratique, c'est g�n�ralement source de confusion car cela diminue la distinction entre cha�nes binaires et cha�nes textuelles. De plus le m�canisme particulier de l'�chappement qui a �t� choisi est quelque peu unwieldy. Donc ce format devrait probablement �tre �vit� pour la plupart des nouvelles applications.

Lors de la saisie de valeurs bytea dans le format d'�chappement, les octets de certaines valeurs doivent �tre �chapp�s alors que les autres valeurs d'octet peuvent �tre �chapp�s. En g�n�ral, pour �chapper un octet, il suffit de le convertir dans sa valeur octal compos�e de trois chiffres et de la faire pr�c�der d'un antislash (ou de deux antislashs s'il faut utiliser la syntaxe d'�chappement de cha�nes). L'antislash lui-m�me (octet 92) peut alternativement �tre repr�sent� par un double 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 fait 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) sont doubl�s. 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.