The binary keyword will force all data to be stored/read as binary objects rather than as ASCII text. It is somewhat faster than the normal copy command, but is not generally portable, and the files generated are somewhat larger, although this factor is highly dependent on the data itself. By default, a ASCII copy uses a tab (\t) character as a delimiter. The delimiter may also be changed to any other single-character with the use of using delimiters. Characters in data fields which happen to match the delimiter character will be quoted.
You must have read access on any class whose values are read by the copy command, and either write or append access to a class to which values are being appended by the copy command.
The actual format for each instance is <attr1><tab><attr2><tab>...<tab><attrn><newline>
The oid is placed on the beginning of the line if specified.
If copy is sending its output to standard output instead of a file, it will send a backslash(\) and a period (.) followed immediately by a newline, on a line by themselves, when it is done. Similarly, if copy is reading from standard input, it will expect a backslash (\) and a period (.) followed by a newline, as the first three characters on a line, to denote end-of-file. However, copy will terminate (followed by the backend itself) if a true EOF is encountered.
The backslash character has special meaning. NULL attributes are output as \N. A literal backslash character is output as two consecutive backslashes. A literal tab character is represented as a backslash and a tab. A literal newline character is represented as a backslash and a newline. When loading ASCII data not generated by PostgreSQL, you will need to convert backslash characters (\) to double-backslashes (\\) so they are loaded properly.
The format for each instance in the file is as follows. Note that this
format must be followed EXACTLY. Unsigned four-byte integer quantities are
called uint32 in the below description. The first value is:
uint32 number
of tuples
then for each tuple:
uint32 total length of data segment
uint32 oid (if specified)
uint32 number of null attributes
[uint32 attribute
number of first null attribute
...
uint32 attribute number of nth null
attribute],
<data segment>
Copy stops operation at the first error. This should not lead to problems in the event of a copy from, but the target relation will, of course, be partially modified in a copy to. The vacuum(l) query should be used to clean up after a failed copy.
Because Postgres operates out of a different directory than the user's working directory at the time Postgres is invoked, the result of copying to a file `foo' (without additional path information) may yield unexpected results for the naive user. In this case, `foo' will wind up in $PGDATA /foo. In general, the full pathname should be used when specifying files to be copied.