| 1 |
<!-- |
|---|
| 2 |
$Header: /var/lib/cvs/pgsql-fr/sgml/ref/copy.sgml,v 1.8.2.3 2005/07/15 06:33:52 guillaume Exp $ |
|---|
| 3 |
PostgreSQL documentation |
|---|
| 4 |
--> |
|---|
| 5 |
|
|---|
| 6 |
<refentry id="SQL-COPY"> |
|---|
| 7 |
<refmeta> |
|---|
| 8 |
<refentrytitle id="sql-copy-title">COPY</refentrytitle> |
|---|
| 9 |
<refmiscinfo>SQL - Instructions du langage</refmiscinfo> |
|---|
| 10 |
</refmeta> |
|---|
| 11 |
|
|---|
| 12 |
<refnamediv> |
|---|
| 13 |
<refname>COPY</refname> |
|---|
| 14 |
<refpurpose>copie des données entre un fichier et une table</refpurpose> |
|---|
| 15 |
</refnamediv> |
|---|
| 16 |
|
|---|
| 17 |
<indexterm zone="sql-copy"> |
|---|
| 18 |
<primary>COPY</primary> |
|---|
| 19 |
</indexterm> |
|---|
| 20 |
|
|---|
| 21 |
<refsynopsisdiv> |
|---|
| 22 |
<synopsis> |
|---|
| 23 |
COPY <replaceable class="parameter">nomtable</replaceable> [ ( <replaceable |
|---|
| 24 |
class="parameter">colonne</replaceable> [, ...] ) ] |
|---|
| 25 |
FROM { '<replaceable class="parameter">nomfichier</replaceable>' | STDIN } |
|---|
| 26 |
[ [ WITH ] |
|---|
| 27 |
[ BINARY ] |
|---|
| 28 |
[ OIDS ] |
|---|
| 29 |
[ DELIMITER [ AS ] '<replaceable |
|---|
| 30 |
class="parameter">délimiteur</replaceable>' ] |
|---|
| 31 |
[ NULL [ AS ] '<replaceable class="parameter">chaîne |
|---|
| 32 |
NULL</replaceable>' ] ] |
|---|
| 33 |
|
|---|
| 34 |
COPY <replaceable class="parameter">nomtable</replaceable> [ ( <replaceable |
|---|
| 35 |
class="parameter">colonne</replaceable> [, ...] ) ] |
|---|
| 36 |
TO { '<replaceable class="parameter">nomfichier</replaceable>' | STDOUT } |
|---|
| 37 |
[ [ WITH ] |
|---|
| 38 |
[ BINARY ] |
|---|
| 39 |
[ OIDS ] |
|---|
| 40 |
[ DELIMITER [ AS ] '<replaceable |
|---|
| 41 |
class="parameter">délimiteur</replaceable>' ] |
|---|
| 42 |
[ NULL [ AS ] '<replaceable class="parameter">chaîne |
|---|
| 43 |
NULL</replaceable>' ] ] |
|---|
| 44 |
</synopsis> |
|---|
| 45 |
</refsynopsisdiv> |
|---|
| 46 |
|
|---|
| 47 |
<refsect1> |
|---|
| 48 |
<title>Description</title> |
|---|
| 49 |
|
|---|
| 50 |
<para> |
|---|
| 51 |
<command>COPY</command> déplace des données entre les tables de |
|---|
| 52 |
<productname>PostgreSQL</productname> et les fichiers du système de |
|---|
| 53 |
fichiers standard. <command>COPY TO</command> copie le contenu d'une table |
|---|
| 54 |
<emphasis>dans</> un fichier alors que <command>COPY FROM</command> copie |
|---|
| 55 |
des données <emphasis>à partir</> d'un fichier dans une table (ajoutant les |
|---|
| 56 |
données à ce qui se trouve déjà dans la table). |
|---|
| 57 |
</para> |
|---|
| 58 |
|
|---|
| 59 |
<para> |
|---|
| 60 |
Si une liste de colonnes est spécifiée, <command>COPY</command> copiera |
|---|
| 61 |
seulement les données des colonnes spécifiées vers ou à partir du fichier. |
|---|
| 62 |
S'il y a des colonnes dans la table qui ne se trouvent pas dans la liste de |
|---|
| 63 |
colonnes, <command>COPY FROM</command> insérera les valeurs par défaut de ces |
|---|
| 64 |
colonnes. |
|---|
| 65 |
</para> |
|---|
| 66 |
|
|---|
| 67 |
<para> |
|---|
| 68 |
<command>COPY</command> avec un nom de fichier indique au serveur |
|---|
| 69 |
<productname>PostgreSQL</productname> de lire directement à partir d'un |
|---|
| 70 |
fichier ou d'écrire dans un fichier. Le fichier doit être accessible du |
|---|
| 71 |
serveur et le nom doit être spécifié à partir du point de vue du serveur. |
|---|
| 72 |
Lorsque <literal>STDIN</literal> ou <literal>STDOUT</literal> est indiqué, |
|---|
| 73 |
les données sont transmises via la connexion entre le client et le serveur. |
|---|
| 74 |
</para> |
|---|
| 75 |
</refsect1> |
|---|
| 76 |
|
|---|
| 77 |
<refsect1> |
|---|
| 78 |
<title>Paramètres</title> |
|---|
| 79 |
|
|---|
| 80 |
<variablelist> |
|---|
| 81 |
<varlistentry> |
|---|
| 82 |
<term><replaceable class="parameter">nomtable</replaceable></term> |
|---|
| 83 |
<listitem> |
|---|
| 84 |
<para> |
|---|
| 85 |
Le nom d'une table existante (pouvant être qualifié avec le nom du schéma). |
|---|
| 86 |
</para> |
|---|
| 87 |
</listitem> |
|---|
| 88 |
</varlistentry> |
|---|
| 89 |
|
|---|
| 90 |
<varlistentry> |
|---|
| 91 |
<term><replaceable class="parameter">colonne</replaceable></term> |
|---|
| 92 |
<listitem> |
|---|
| 93 |
<para> |
|---|
| 94 |
Une liste optionnelle de colonnes à copier. Si aucune liste n'est donnée, |
|---|
| 95 |
toutes les colonnes seront utilisées. |
|---|
| 96 |
</para> |
|---|
| 97 |
</listitem> |
|---|
| 98 |
</varlistentry> |
|---|
| 99 |
|
|---|
| 100 |
<varlistentry> |
|---|
| 101 |
<term><replaceable class="parameter">nomfichier</replaceable></term> |
|---|
| 102 |
<listitem> |
|---|
| 103 |
<para> |
|---|
| 104 |
Le chemin absolu du fichier en entrée ou en sortie. |
|---|
| 105 |
</para> |
|---|
| 106 |
</listitem> |
|---|
| 107 |
</varlistentry> |
|---|
| 108 |
|
|---|
| 109 |
<varlistentry> |
|---|
| 110 |
<term><literal>STDIN</literal></term> |
|---|
| 111 |
<listitem> |
|---|
| 112 |
<para> |
|---|
| 113 |
Spécifie que l'entrée provient de l'application cliente. |
|---|
| 114 |
</para> |
|---|
| 115 |
</listitem> |
|---|
| 116 |
</varlistentry> |
|---|
| 117 |
|
|---|
| 118 |
<varlistentry> |
|---|
| 119 |
<term><literal>STDOUT</literal></term> |
|---|
| 120 |
<listitem> |
|---|
| 121 |
<para> |
|---|
| 122 |
Spécifie que la sortie va vers l'application cliente. |
|---|
| 123 |
</para> |
|---|
| 124 |
</listitem> |
|---|
| 125 |
</varlistentry> |
|---|
| 126 |
|
|---|
| 127 |
<varlistentry> |
|---|
| 128 |
<term><literal>BINARY</literal></term> |
|---|
| 129 |
<listitem> |
|---|
| 130 |
<para> |
|---|
| 131 |
Fait que toutes les données sont stockées ou lues au format binaire plutôt |
|---|
| 132 |
qu'en texte. Vous ne pouvez pas spécifier les options |
|---|
| 133 |
<option>DELIMITER</option> ou <option>NULL</option> en mode binaire. |
|---|
| 134 |
</para> |
|---|
| 135 |
</listitem> |
|---|
| 136 |
</varlistentry> |
|---|
| 137 |
|
|---|
| 138 |
<varlistentry> |
|---|
| 139 |
<term><literal>OIDS</literal></term> |
|---|
| 140 |
<listitem> |
|---|
| 141 |
<para> |
|---|
| 142 |
Demande la copie des OID pour chaque ligne. (Une erreur est levée si |
|---|
| 143 |
<literal>OIDS</literal> est spécifié pour une table qui ne possède pas |
|---|
| 144 |
d'OID.) |
|---|
| 145 |
</para> |
|---|
| 146 |
</listitem> |
|---|
| 147 |
</varlistentry> |
|---|
| 148 |
|
|---|
| 149 |
<varlistentry> |
|---|
| 150 |
<term><replaceable class="parameter">délimiteur</replaceable></term> |
|---|
| 151 |
<listitem> |
|---|
| 152 |
<para> |
|---|
| 153 |
Le caractère simple qui sépare les colonnes pour chaque ligne d'un |
|---|
| 154 |
fichier. La valeur par défaut est le caractère de tabulation. |
|---|
| 155 |
</para> |
|---|
| 156 |
</listitem> |
|---|
| 157 |
</varlistentry> |
|---|
| 158 |
|
|---|
| 159 |
<varlistentry> |
|---|
| 160 |
<term><replaceable class="parameter">chaîne NULL</replaceable></term> |
|---|
| 161 |
<listitem> |
|---|
| 162 |
<para> |
|---|
| 163 |
La chaîne qui représente une valeur NULL. Par défaut, elle vaut |
|---|
| 164 |
<literal>\N</literal> (antislash-N). Vous pourriez préférer une chaîne |
|---|
| 165 |
vide par exemple. |
|---|
| 166 |
</para> |
|---|
| 167 |
|
|---|
| 168 |
<note> |
|---|
| 169 |
<para> |
|---|
| 170 |
Sur un <command>COPY FROM</command>, tout élément de données |
|---|
| 171 |
correspondant à cette chaîne sera stocké comme valeur NULL, donc vous |
|---|
| 172 |
devriez vous assurer que vous utilisez la même chaîne que celle que vous |
|---|
| 173 |
avez utilisé avec <command>COPY TO</command>. |
|---|
| 174 |
</para> |
|---|
| 175 |
</note> |
|---|
| 176 |
</listitem> |
|---|
| 177 |
</varlistentry> |
|---|
| 178 |
</variablelist> |
|---|
| 179 |
</refsect1> |
|---|
| 180 |
|
|---|
| 181 |
<refsect1> |
|---|
| 182 |
<title>Notes</title> |
|---|
| 183 |
|
|---|
| 184 |
<para> |
|---|
| 185 |
<command>COPY</command> peut seulement être utilisé avec des tables réelles, |
|---|
| 186 |
pas avec des vues. |
|---|
| 187 |
</para> |
|---|
| 188 |
|
|---|
| 189 |
<para> |
|---|
| 190 |
Le mot clé <literal>BINARY</literal> fait que toutes les données sont |
|---|
| 191 |
stockées/lues dans le format binaire plutôt qu'en texte. Il est un peu |
|---|
| 192 |
plus rapide que le mode texte standard mais un fichier binaire est moins |
|---|
| 193 |
portable au travers des architectures machine et des versions de |
|---|
| 194 |
<productname>PostgreSQL</productname>. |
|---|
| 195 |
</para> |
|---|
| 196 |
|
|---|
| 197 |
<para> |
|---|
| 198 |
Vous devez avoir le droit SELECT sur la table dont les valeurs sont |
|---|
| 199 |
lues par <command>COPY TO</command> et le droit INSERT sur la table dont les |
|---|
| 200 |
valeurs sont insérées par <command>COPY FROM</command>. |
|---|
| 201 |
</para> |
|---|
| 202 |
|
|---|
| 203 |
<para> |
|---|
| 204 |
Les fichiers nommés dans une commande <command>COPY</command> sont lus ou |
|---|
| 205 |
écrits directement par le serveur, et non pas par l'application cliente. Du |
|---|
| 206 |
coup, ils doivent résider ou être accessible par la machine du serveur de |
|---|
| 207 |
bases de données. Ils doivent être accessibles et lisibles ou modifiables |
|---|
| 208 |
par l'utilisateur <productname>PostgreSQL</productname> (l'identifiant de |
|---|
| 209 |
l'utilisateur qui a exécuté le serveur), et non pas par le client. |
|---|
| 210 |
<command>COPY</command> nommant un fichier est seulement autorisé pour les |
|---|
| 211 |
superutilisateurs de la base de données car il autorise la lecture ou |
|---|
| 212 |
l'écriture de tout fichier auquel a accès le serveur. |
|---|
| 213 |
</para> |
|---|
| 214 |
|
|---|
| 215 |
<para> |
|---|
| 216 |
Ne confondez pas <command>COPY</command> avec l'instruction |
|---|
| 217 |
<command>\copy</command> de <application>psql</application>. |
|---|
| 218 |
<command>\copy</command> appelle <command>COPY FROM STDIN</command> ou |
|---|
| 219 |
<command>COPY TO STDOUT</command>, puis récupère/stocke la donnée dans un |
|---|
| 220 |
fichier accessible au client <application>psql</application>. Du coup, |
|---|
| 221 |
l'accès au fichier et les droits d'accès dépendent du client plutôt que du |
|---|
| 222 |
serveur quand <command>\copy</command> est utilisé. |
|---|
| 223 |
</para> |
|---|
| 224 |
|
|---|
| 225 |
<para> |
|---|
| 226 |
Il est recommandé que le nom du fichier utilisé dans |
|---|
| 227 |
<command>COPY</command> soit toujours utilisé avec un chemin absolu. Ceci |
|---|
| 228 |
est renforcé par le serveur dans le cas d'un <command>COPY TO</command> |
|---|
| 229 |
mais, pour les <command>COPY FROM</command>, vous devez avoir l'option de |
|---|
| 230 |
lire à partir d'un fichier spécifié par un chemin relatif. Le chemin sera |
|---|
| 231 |
interprété de façon relative au répertoire de travail du processus serveur |
|---|
| 232 |
(quelque part en-dessous du répertoire de données), pas dans le répertoire |
|---|
| 233 |
de travail du client. |
|---|
| 234 |
</para> |
|---|
| 235 |
|
|---|
| 236 |
<para> |
|---|
| 237 |
<command>COPY FROM</command> appellera tout déclencheur et vérifiera les |
|---|
| 238 |
contraintes sur la table de destination. Néanmoins, il n'appellera pas les |
|---|
| 239 |
règles. |
|---|
| 240 |
</para> |
|---|
| 241 |
|
|---|
| 242 |
<para> |
|---|
| 243 |
<command>COPY</command> stoppe l'opération à la première erreur. Ceci ne |
|---|
| 244 |
devrait apporter aucun problème dans le cas d'un <command>COPY TO</command> |
|---|
| 245 |
mais la table cible aura déjà reçu des lignes précédentes dans un |
|---|
| 246 |
<command>COPY FROM</command>. Ces lignes ne seront pas visibles ou |
|---|
| 247 |
accessibles mais elle occuperont toujours de l'espace disque. Ceci pourrait |
|---|
| 248 |
totaliser une perte considérable d'espace disque si l'échec arrivait lors |
|---|
| 249 |
d'une grande opération de copie. Vous pourriez souhaiter appeler |
|---|
| 250 |
<command>VACUUM</command> pour récupérer l'espace perdu. |
|---|
| 251 |
</para> |
|---|
| 252 |
</refsect1> |
|---|
| 253 |
|
|---|
| 254 |
<refsect1> |
|---|
| 255 |
<title>Formats de fichiers</title> |
|---|
| 256 |
|
|---|
| 257 |
<refsect2> |
|---|
| 258 |
<title>Format texte</title> |
|---|
| 259 |
|
|---|
| 260 |
<para> |
|---|
| 261 |
Quand <command>COPY</command> est utilisé sans l'option |
|---|
| 262 |
<literal>BINARY</literal>, les données lues ou écrites sont dans un fichier |
|---|
| 263 |
avec une ligne de données par ligne de la table. Les colonnes d'une ligne |
|---|
| 264 |
sont séparées par le caractère délimiteur. Les valeurs des colonnes sont des |
|---|
| 265 |
chaînes générées par la fonction de sortie ou acceptables par la fonction |
|---|
| 266 |
d'entrée de chaque type de données d'attribut. La chaîne NULL spécifiée est |
|---|
| 267 |
utilisée à la place des colonnes NULL. <command>COPY FROM</command> lèvera |
|---|
| 268 |
une erreur si une des lignes du fichier en entrée contient plus ou moins de |
|---|
| 269 |
colonnes qu'attendues. Si <literal>OIDS</literal> est spécifié, l'OID est lu |
|---|
| 270 |
ou écrit dans la première colonne, précédant ainsi les colonnes de données |
|---|
| 271 |
de l'utilisateur. |
|---|
| 272 |
</para> |
|---|
| 273 |
|
|---|
| 274 |
<para> |
|---|
| 275 |
La fin des données peut être représentée par une simple ligne contenant |
|---|
| 276 |
juste un antislash et un point (<literal>\.</>). Un marqueur de fin de |
|---|
| 277 |
données n'est pas nécessaire lors de la lecture d'un fichier car la fin du |
|---|
| 278 |
fichier sert bien il est seulement nécessaire lors de la copie de |
|---|
| 279 |
données vers ou à partir d'une application cliente en utilisant le protocole |
|---|
| 280 |
client pre-3.0. |
|---|
| 281 |
</para> |
|---|
| 282 |
|
|---|
| 283 |
<para> |
|---|
| 284 |
Les caractères antislash (<literal>\</>) pourraient être utilisés dans les |
|---|
| 285 |
données <command>COPY</command> pour mettre entre guillemets les données de |
|---|
| 286 |
caractères qui pourraient sinon être prises comme délimiteurs de ligne ou de |
|---|
| 287 |
colonne. En particulier, les caractères suivants <emphasis>doivent</> être |
|---|
| 288 |
précédés par un antislash s'ils apparaissent comme faisant partie de la |
|---|
| 289 |
valeur d'une colonne : antislash lui-même, nouvelle ligne, retour |
|---|
| 290 |
chariot et caractère délimiteur actuel. |
|---|
| 291 |
</para> |
|---|
| 292 |
|
|---|
| 293 |
<para> |
|---|
| 294 |
La chaîne NULL spécifiée est envoyée par <command>COPY TO</command> sans |
|---|
| 295 |
ajout d'antislash ; au contraire, <command>COPY FROM</command> fait |
|---|
| 296 |
correspondre l'entrée avec la chaîne NULL avant de supprimer les antislash. |
|---|
| 297 |
Du coup, une chaîne NULL telle que <literal>\N</literal> ne peut pas être |
|---|
| 298 |
confondu avec la valeur de donnée réelle <literal>\N</literal> (qui serait |
|---|
| 299 |
représentée par <literal>\\N</literal>). |
|---|
| 300 |
</para> |
|---|
| 301 |
|
|---|
| 302 |
<para> |
|---|
| 303 |
Les séquences spéciales suivantes sont reconnues par <command>COPY |
|---|
| 304 |
FROM</command> : |
|---|
| 305 |
|
|---|
| 306 |
<informaltable> |
|---|
| 307 |
<tgroup cols="2"> |
|---|
| 308 |
<thead> |
|---|
| 309 |
<row> |
|---|
| 310 |
<entry>Séquence</entry> |
|---|
| 311 |
<entry>Représenté</entry> |
|---|
| 312 |
</row> |
|---|
| 313 |
</thead> |
|---|
| 314 |
|
|---|
| 315 |
<tbody> |
|---|
| 316 |
<row> |
|---|
| 317 |
<entry><literal>\b</></entry> |
|---|
| 318 |
<entry>Suppression (ASCII 8)</entry> |
|---|
| 319 |
</row> |
|---|
| 320 |
<row> |
|---|
| 321 |
<entry><literal>\f</></entry> |
|---|
| 322 |
<entry>Retour chariot (ASCII 12)</entry> |
|---|
| 323 |
</row> |
|---|
| 324 |
<row> |
|---|
| 325 |
<entry><literal>\n</></entry> |
|---|
| 326 |
<entry>Nouvelle ligne (ASCII 10)</entry> |
|---|
| 327 |
</row> |
|---|
| 328 |
<row> |
|---|
| 329 |
<entry><literal>\r</></entry> |
|---|
| 330 |
<entry>Retour chariot (ASCII 13)</entry> |
|---|
| 331 |
</row> |
|---|
| 332 |
<row> |
|---|
| 333 |
<entry><literal>\t</></entry> |
|---|
| 334 |
<entry>Tabulation (ASCII 9)</entry> |
|---|
| 335 |
</row> |
|---|
| 336 |
<row> |
|---|
| 337 |
<entry><literal>\v</></entry> |
|---|
| 338 |
<entry>Tabulation verticale (ASCII 11)</entry> |
|---|
| 339 |
</row> |
|---|
| 340 |
<row> |
|---|
| 341 |
<entry><literal>\</><replaceable>chiffres</></entry> |
|---|
| 342 |
<entry>Un antislash suivi par un à trois chiffres en octal spécifie le |
|---|
| 343 |
caractère ayant ce code numérique</entry> |
|---|
| 344 |
</row> |
|---|
| 345 |
</tbody> |
|---|
| 346 |
</tgroup> |
|---|
| 347 |
</informaltable> |
|---|
| 348 |
|
|---|
| 349 |
Actuellement, <command>COPY TO</command> n'émettra jamais une séquence |
|---|
| 350 |
octale mais utilisera les autres séquences listées ci-dessus pour les |
|---|
| 351 |
caractères de contrôle. |
|---|
| 352 |
</para> |
|---|
| 353 |
|
|---|
| 354 |
<para> |
|---|
| 355 |
Tout autre caractère avec un antislash se représentera lui-même. |
|---|
| 356 |
Néanmoins, attention à l'ajout non nécessaire d'antislash car cela |
|---|
| 357 |
pourrait produire accidentellement une correspondance de chaîne avec |
|---|
| 358 |
le marqueur de fin de données (<literal>\.</>) ou la chaîne NULL |
|---|
| 359 |
(<literal>\N</> par défaut). Ces chaînes seront reconnues avant tout |
|---|
| 360 |
traitement des antislashs. |
|---|
| 361 |
</para> |
|---|
| 362 |
|
|---|
| 363 |
<para> |
|---|
| 364 |
Il est fortement recommandé que les applications générant des données COPY |
|---|
| 365 |
convertissent les nouvelles lignes et retours chariot avec les séquences |
|---|
| 366 |
<literal>\n</> et <literal>\r</>, respectivement. À présent, il |
|---|
| 367 |
est possible de représenter un retour chariot par un antislash et un retour |
|---|
| 368 |
chariot, et de représenter une nouvelle ligne par un antislash et une |
|---|
| 369 |
nouvelle ligne. Néanmoins, ces représentations pourraient ne pas être |
|---|
| 370 |
acceptées dans les prochaines versions. Elles sont aussi hautement |
|---|
| 371 |
vulnérables à la corruption si le fichier COPY est transféré via différentes |
|---|
| 372 |
machines (par exemple, à partir d'un Unix vers un Windows ou vice versa). |
|---|
| 373 |
</para> |
|---|
| 374 |
|
|---|
| 375 |
<para> |
|---|
| 376 |
<command>COPY TO</command> terminera chaque ligne avec une |
|---|
| 377 |
nouvelle ligne style Unix (<quote><literal>\n</></>). Les serveurs |
|---|
| 378 |
fonctionnant avec MS Windows terminent la ligne avec un retour |
|---|
| 379 |
chariot/nouvelle ligne |
|---|
| 380 |
(<quote><literal>\r\n</></>) mais seulement pour <command>COPY</> dans un |
|---|
| 381 |
fichier serveur ; pour des raisons de cohérence au niveau des |
|---|
| 382 |
plateformes, <command>COPY TO STDOUT</> envoie toujours |
|---|
| 383 |
<quote><literal>\n</></> quelque soit la plateforme du serveur. |
|---|
| 384 |
<command>COPY FROM</command> peut gérer des fin de lignes avec une nouvelle |
|---|
| 385 |
ligne, un retour chariot ou un retour chariot suivi d'une nouvelle ligne. |
|---|
| 386 |
Pour réduire les risques d'erreurs dûes à une nouvelle ligne ou un retour |
|---|
| 387 |
chariot sans antislash qui étaient des données, <command>COPY FROM</command> |
|---|
| 388 |
se plaindra si les fins de ligne dans l'entrée ne sont pas identiques. |
|---|
| 389 |
</para> |
|---|
| 390 |
</refsect2> |
|---|
| 391 |
|
|---|
| 392 |
<refsect2> |
|---|
| 393 |
<title>Format binaire</title> |
|---|
| 394 |
|
|---|
| 395 |
<para> |
|---|
| 396 |
Le format de fichier utilisé pour <command>COPY BINARY</command> a été |
|---|
| 397 |
modifié dans <productname>PostgreSQL</productname> 7.4. Le nouveau format |
|---|
| 398 |
consiste en un fichier d'en-tête, zéro ou plusieurs lignes contenant la |
|---|
| 399 |
donnée de la ligne et une queue de fichier. Les en-têtes et les données sont |
|---|
| 400 |
maintenant dans l'ordre d'octets du réseau. |
|---|
| 401 |
</para> |
|---|
| 402 |
|
|---|
| 403 |
<refsect3> |
|---|
| 404 |
<title>En-tête du fichier</title> |
|---|
| 405 |
|
|---|
| 406 |
<para> |
|---|
| 407 |
Le fichier d'en-tête consiste en 15 octets de champs fixes, suivis par une |
|---|
| 408 |
aire d'extension de l'en-tête de longueur variable. Les champs fixes |
|---|
| 409 |
sont : |
|---|
| 410 |
|
|---|
| 411 |
<variablelist> |
|---|
| 412 |
<varlistentry> |
|---|
| 413 |
<term>Signature</term> |
|---|
| 414 |
<listitem> |
|---|
| 415 |
<para> |
|---|
| 416 |
séquence de 11 octets <literal>PGCOPY\n\377\r\n\0</> --- notez que |
|---|
| 417 |
l'octet zéro est une partie requise de la signature. (La signature est |
|---|
| 418 |
conçue pour permettre une identification aisée des fichiers qui ont été |
|---|
| 419 |
déteriorés par un transfert qui ne s'est pas fait sur huit bits. Cette |
|---|
| 420 |
signature sera modifiée par des filtres de traduction de fin de ligne, |
|---|
| 421 |
suppression des octets zéro, suppression des bits de poids forts ou |
|---|
| 422 |
modification de parité.) |
|---|
| 423 |
</para> |
|---|
| 424 |
</listitem> |
|---|
| 425 |
</varlistentry> |
|---|
| 426 |
|
|---|
| 427 |
<varlistentry> |
|---|
| 428 |
<term>Champs de commutateurs</term> |
|---|
| 429 |
<listitem> |
|---|
| 430 |
<para> |
|---|
| 431 |
masque entier de 32 bits dénotant les aspects importants du format de |
|---|
| 432 |
fichier. Les bits sont numérotés de 0 (<acronym>LSB</>) à 31 |
|---|
| 433 |
(<acronym>MSB</>). Notez que ce champ est stocké dans l'ordre des octets |
|---|
| 434 |
du réseau (l'octet le plus significatif en premier), comme le sont tous |
|---|
| 435 |
les champs d'entier utilisés dans le format de fichier. Les bits 16 à 31 |
|---|
| 436 |
sont réservés pour dénoter les problèmes critiques de format de |
|---|
| 437 |
fichier ; un lecteur devrait annuler l'opération s'il trouve un bit |
|---|
| 438 |
inattendu dans cet ensemble. Les bits 0 à 15 sont réservés pour signaler |
|---|
| 439 |
des problèmes de compatibilité de formats ; un lecteur devrait |
|---|
| 440 |
simplement ignorer les bits inattendus dans cet ensemble. Actuellement, |
|---|
| 441 |
seul un bit est défini et le reste doit être à zéro : |
|---|
| 442 |
<variablelist> |
|---|
| 443 |
<varlistentry> |
|---|
| 444 |
<term>Bit 16</term> |
|---|
| 445 |
<listitem> |
|---|
| 446 |
<para> |
|---|
| 447 |
si 1, les OID sont inclus dans la donnée ; si 0, non |
|---|
| 448 |
</para> |
|---|
| 449 |
</listitem> |
|---|
| 450 |
</varlistentry> |
|---|
| 451 |
</variablelist> |
|---|
| 452 |
</para> |
|---|
| 453 |
</listitem> |
|---|
| 454 |
</varlistentry> |
|---|
| 455 |
|
|---|
| 456 |
<varlistentry> |
|---|
| 457 |
<term>Longueur de l'aire d'extension de l'en-tête</term> |
|---|
| 458 |
<listitem> |
|---|
| 459 |
<para> |
|---|
| 460 |
Entier sur 32 bits, longueur en octets sur le reste de l'en-tête, ne |
|---|
| 461 |
s'incluant pas lui-même. Actuellement, c'est zéro et la première ligne |
|---|
| 462 |
suit immédiatement. Les modifications futures du format pourraient |
|---|
| 463 |
permettre la présence de données supplémentaires dans l'en-tête. Un |
|---|
| 464 |
lecteur devrait passer silencieusement toute donnée dans l'extension de |
|---|
| 465 |
l'en-tête s'il ne sait pas quoi faire avec. |
|---|
| 466 |
</para> |
|---|
| 467 |
</listitem> |
|---|
| 468 |
</varlistentry> |
|---|
| 469 |
</variablelist> |
|---|
| 470 |
</para> |
|---|
| 471 |
|
|---|
| 472 |
<para> |
|---|
| 473 |
L'aire d'extension de l'en-tête devrait contenir une séquence de morceaux |
|---|
| 474 |
qui s'identifient eux-même. Le champ des commutateurs n'a pas pour but |
|---|
| 475 |
d'indiquer aux lecteurs ce qui se trouve dans l'aire d'extension. La |
|---|
| 476 |
conception spécifique du contenu de l'extension de l'en-tête est laissée à |
|---|
| 477 |
une prochaine version. |
|---|
| 478 |
</para> |
|---|
| 479 |
|
|---|
| 480 |
<para> |
|---|
| 481 |
Cette conception permet des ajouts d'en-têtes compatibles (ajout de |
|---|
| 482 |
morceaux d'extension d'en-tête, ou initialisation des options de faible |
|---|
| 483 |
poids) et modifications non compatibles (initialisation des options de |
|---|
| 484 |
poids pour signaler des modifications, et ajout des données de support dans |
|---|
| 485 |
l'aire d'extension si nécessaire). |
|---|
| 486 |
</para> |
|---|
| 487 |
</refsect3> |
|---|
| 488 |
|
|---|
| 489 |
<refsect3> |
|---|
| 490 |
<title>Lignes</title> |
|---|
| 491 |
<para> |
|---|
| 492 |
Chaque ligne commence avec un compteur sur 16 bits du nombre de champs dans |
|---|
| 493 |
la ligne. (Actuellement, toutes les lignes dans une table auront le même |
|---|
| 494 |
compte mais ceci pourrait ne pas être toujours vrai.) Ensuite, répété pour |
|---|
| 495 |
chaque champ de la ligne, il y a un mot de 32 bits suivi par autant |
|---|
| 496 |
d'octets que de données. (Le mot clé n'inclut pas sa propre longueur et |
|---|
| 497 |
peut donc valoir zéro.) Comme cas spécial, -1 indique une valeur de champ |
|---|
| 498 |
NULL. Aucun octet de valeur ne suit dans le cas NULL. |
|---|
| 499 |
</para> |
|---|
| 500 |
|
|---|
| 501 |
<para> |
|---|
| 502 |
Il n'y a pas d'ajout pour l'alignement ou toute autre donnée supplémentaire |
|---|
| 503 |
entre les champs. |
|---|
| 504 |
</para> |
|---|
| 505 |
|
|---|
| 506 |
<para> |
|---|
| 507 |
Actuellement, toutes les valeurs dans un fichier <command>COPY |
|---|
| 508 |
BINARY</command> sont supposées être dans un format binaire (format code |
|---|
| 509 |
un). Une future extension pourrait ajouter un champ d'en-tête qui autorise |
|---|
| 510 |
la spécification des codes de format par colonne. |
|---|
| 511 |
</para> |
|---|
| 512 |
|
|---|
| 513 |
<para> |
|---|
| 514 |
Pour déterminer le format binaire approprié pour la donnée réelle, vous |
|---|
| 515 |
devriez consulter le source de <productname>PostgreSQL</productname>, en |
|---|
| 516 |
particulier les fonctions <function>*send</> et <function>*recv</> pour |
|---|
| 517 |
chaque type de données de la colonne (typiquement ces fonctions se |
|---|
| 518 |
trouvent dans le répertoire <filename>src/backend/utils/adt/</filename> des |
|---|
| 519 |
sources). |
|---|
| 520 |
</para> |
|---|
| 521 |
|
|---|
| 522 |
<para> |
|---|
| 523 |
Si les OID sont inclus dans le fichier, le champ OID est immédiatement |
|---|
| 524 |
suivi du compteur de champ. C'est un champ normal sauf qu'il n'est pas |
|---|
| 525 |
inclus dans le champ compteur. En particulier, il a une longueur d'un mot |
|---|
| 526 |
--- ceci permettra la gestion d'OID à quatre octets plutôt que huit sans |
|---|
| 527 |
trop de peine et permettra l'affichage des OID comme NULL si cela se révèle |
|---|
| 528 |
intéressant. |
|---|
| 529 |
</para> |
|---|
| 530 |
</refsect3> |
|---|
| 531 |
|
|---|
| 532 |
<refsect3> |
|---|
| 533 |
<title>Queue du fichier</title> |
|---|
| 534 |
|
|---|
| 535 |
<para> |
|---|
| 536 |
La fin du fichier consiste en un entier sur 16 bits contenant -1. Ceci est |
|---|
| 537 |
facilement distingué du compteur de champ d'une ligne. |
|---|
| 538 |
</para> |
|---|
| 539 |
|
|---|
| 540 |
<para> |
|---|
| 541 |
Un lecteur devrait rapporter une erreur si un mot de comptage de champ est |
|---|
| 542 |
soit -1 soit le nombre attendu de colonnes. Ceci fournit une vérification |
|---|
| 543 |
supplémentaire sur quelque chose pouvant être hors synchronisation avec les |
|---|
| 544 |
données. |
|---|
| 545 |
</para> |
|---|
| 546 |
</refsect3> |
|---|
| 547 |
</refsect2> |
|---|
| 548 |
</refsect1> |
|---|
| 549 |
|
|---|
| 550 |
<refsect1> |
|---|
| 551 |
<title>Exemples</title> |
|---|
| 552 |
|
|---|
| 553 |
<para> |
|---|
| 554 |
L'exemple suivant copie une table vers le client en utilisant la barre |
|---|
| 555 |
verticale (<literal>|</literal>) comme délimiteur de champ : |
|---|
| 556 |
<programlisting> |
|---|
| 557 |
COPY pays TO STDOUT WITH DELIMITER '|'; |
|---|
| 558 |
</programlisting> |
|---|
| 559 |
</para> |
|---|
| 560 |
|
|---|
| 561 |
<para> |
|---|
| 562 |
Pour copier des données de la table <literal>pays</> vers un fichier : |
|---|
| 563 |
<programlisting> |
|---|
| 564 |
COPY pays FROM '/usr1/proj/bray/sql/pays_donnees'; |
|---|
| 565 |
</programlisting> |
|---|
| 566 |
</para> |
|---|
| 567 |
|
|---|
| 568 |
<para> |
|---|
| 569 |
Voici un exemple de données convenable pour une table provenant de |
|---|
| 570 |
<literal>STDIN</literal> : |
|---|
| 571 |
<programlisting> |
|---|
| 572 |
AF AFGHANISTAN |
|---|
| 573 |
AL ALBANIA |
|---|
| 574 |
DZ ALGERIA |
|---|
| 575 |
ZM ZAMBIA |
|---|
| 576 |
ZW ZIMBABWE |
|---|
| 577 |
</programlisting> |
|---|
| 578 |
Notez que l'espace blanc sur chaque ligne est en fait un caractère de |
|---|
| 579 |
tabulation. |
|---|
| 580 |
</para> |
|---|
| 581 |
|
|---|
| 582 |
<para> |
|---|
| 583 |
Ce qui suit représente les même données, au format binaire. La donnée est |
|---|
| 584 |
affichée après filtrage à travers l'outil Unix <command>od -c</command>. La |
|---|
| 585 |
table a trois colonnes ; la première est de type <type>integer</type>. |
|---|
| 586 |
Toutes les lignes ont une valeur NULL sur la troisième colonne. |
|---|
| 587 |
<programlisting> |
|---|
| 588 |
0000000 P G C O P Y \n 377 \r \n \0 \0 \0 \0 \0 \0 |
|---|
| 589 |
0000020 \0 \0 \0 \0 003 \0 \0 \0 002 A F \0 \0 \0 013 A |
|---|
| 590 |
0000040 F G H A N I S T A N 377 377 377 377 \0 003 |
|---|
| 591 |
0000060 \0 \0 \0 002 A L \0 \0 \0 007 A L B A N I |
|---|
| 592 |
0000100 A 377 377 377 377 \0 003 \0 \0 \0 002 D Z \0 \0 \0 |
|---|
| 593 |
0000120 007 A L G E R I A 377 377 377 377 \0 003 \0 \0 |
|---|
| 594 |
0000140 \0 002 Z M \0 \0 \0 006 Z A M B I A 377 377 |
|---|
| 595 |
0000160 377 377 \0 003 \0 \0 \0 002 Z W \0 \0 \0 \b Z I |
|---|
| 596 |
0000200 M B A B W E 377 377 377 377 377 377 |
|---|
| 597 |
</programlisting> |
|---|
| 598 |
</para> |
|---|
| 599 |
</refsect1> |
|---|
| 600 |
|
|---|
| 601 |
<refsect1> |
|---|
| 602 |
<title>Compatibilité</title> |
|---|
| 603 |
|
|---|
| 604 |
<para> |
|---|
| 605 |
Il n'existe pas d'instruction <command>COPY</command> dans le standard SQL. |
|---|
| 606 |
</para> |
|---|
| 607 |
|
|---|
| 608 |
<para> |
|---|
| 609 |
La syntaxe suivante était utilisée avant PostgreSQL version 7.3 et est |
|---|
| 610 |
toujours supportée : |
|---|
| 611 |
|
|---|
| 612 |
<synopsis> |
|---|
| 613 |
COPY [ BINARY ] <replaceable class="parameter">nomtable</replaceable> [ WITH OIDS ] |
|---|
| 614 |
FROM { '<replaceable class="parameter">nomfichier</replaceable>' | STDIN } |
|---|
| 615 |
[ [USING] DELIMITERS '<replaceable class="parameter">délimiteur</replaceable>' ] |
|---|
| 616 |
[ WITH NULL AS '<replaceable class="parameter">chaîne NULL</replaceable>' ] |
|---|
| 617 |
|
|---|
| 618 |
COPY [ BINARY ] <replaceable class="parameter">nomtable</replaceable> [ WITH OIDS ] |
|---|
| 619 |
TO { '<replaceable class="parameter">nomfichier</replaceable>' | STDOUT } |
|---|
| 620 |
[ [USING] DELIMITERS '<replaceable class="parameter">délimiteur</replaceable>' ] |
|---|
| 621 |
[ WITH NULL AS '<replaceable class="parameter">chaîne NULL</replaceable>' ] |
|---|
| 622 |
</synopsis> |
|---|
| 623 |
</para> |
|---|
| 624 |
</refsect1> |
|---|
| 625 |
</refentry> |
|---|
| 626 |
|
|---|
| 627 |
<!-- Keep this comment at the end of the file |
|---|
| 628 |
Local variables: |
|---|
| 629 |
mode: sgml |
|---|
| 630 |
sgml-omittag:nil |
|---|
| 631 |
sgml-shorttag:t |
|---|
| 632 |
sgml-minimize-attributes:nil |
|---|
| 633 |
sgml-always-quote-attributes:t |
|---|
| 634 |
sgml-indent-step:1 |
|---|
| 635 |
sgml-indent-data:t |
|---|
| 636 |
sgml-parent-document:nil |
|---|
| 637 |
sgml-default-dtd-file:"../reference.ced" |
|---|
| 638 |
sgml-exposed-tags:nil |
|---|
| 639 |
sgml-local-catalogs:"/usr/lib/sgml/catalog" |
|---|
| 640 |
sgml-local-ecat-files:nil |
|---|
| 641 |
End: |
|---|
| 642 |
--> |
|---|