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.
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';
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.