COPY

COPY — копировать данные между файлом и таблицей


Синтаксис

COPY имя_таблицы [ ( имя_столбца [, ...] ) ]
    FROM { 'имя_файла' | PROGRAM 'команда' | STDIN }
    [ [ WITH ] ( параметр [, ...] ) ]
    [ WHERE условие ]

COPY { имя_таблицы [ ( имя_столбца [, ...] ) ] | ( запрос ) }
    TO { 'имя_файла' | PROGRAM 'команда' | STDOUT }
    [ [ WITH ] ( параметр [, ...] ) ]

где параметром может быть:

    FORMAT имя_формата
    FREEZE [ логическое_значение ]
    DELIMITER 'символ_разделитель'
    NULL 'нулевая_строка'
    HEADER [ логическое_значение ]
    QUOTE 'символ_кавычки'
    ESCAPE 'управляющий_символ'
    FORCE_QUOTE { ( имя_столбца [, ...] ) | * }
    FORCE_NOT_NULL ( имя_столбца [, ...] )
    FORCE_NULL ( имя_столбца [, ...] )
    ENCODING 'имя_кодировки'

Описание

Команда COPY перемещает данные между таблицами QHB и стандартными файлами файловой системы. COPY TO копирует содержимое таблицы в файл, а COPY FROM копирует данные из файла в таблицу (добавляя данные к тем, что уже находятся в таблице). Кроме того, команда COPY TO может копировать результаты запроса SELECT.

Если указан список столбцов, COPY TO будет копировать в файл данные только из указанных столбцов. COPY FROM будет по порядку вставлять каждое поле из файла в указанные столбцы. В табличные столбцы, которых нет в списке COPY FROM, будут добавлены их значения по умолчанию.

COPY с именем файла указывает серверу QHB напрямую читать или записывать в конкретный файл. Файл должен быть доступен пользователю QHB (идентификатору пользователя, под которым работает сервер), а путь к нему должен быть указан с точки зрения сервера. Когда указывается PROGRAM, сервер выполняет заданную команду и считывает данные со стандартного вывода программы либо записывает их в стандартный вход программы. Команда должна быть определена с точки зрения сервера и быть выполнимой пользователем QHB. Когда указывается STDIN или STDOUT, данные передаются через соединение между клиентом и сервером.

Каждый обслуживающий процесс, запускающий COPY, будет записывать ход ее выполнения в представлении pg_stat_progress_copy. Более подробную информацию см. в подразделе Отчет о ходе выполнения COPY.


Параметры

имя_таблицы

Имя существующей таблицы (может быть дополнено схемой).

имя_столбца

Необязательный список столбцов для копирования. Если список столбцов не указан, то будут скопированы все столбцы таблицы, кроме генерируемых.

запрос

Команда SELECT, VALUES, INSERT, UPDATE или DELETE, результаты которой должны быть скопированы. Обратите внимание, что запрос заключается в круглые скобки.

Для запросов INSERT, UPDATE и DELETE должно задаваться предложение RETURNING, а целевое отношение не должно иметь ни условного правила, ни правила ALSO, ни правила INSTEAD, разворачивающегося в несколько операторов.

имя_файла

Путь к входному или выходному файлу. Путь входного файла может быть абсолютным или относительным путем, но путь выходного файла должен быть абсолютным путем.

PROGRAM

Выполняемая команда. COPY FROM читает стандартный вывод команды, а COPY TO записывает в ее стандартный ввод

Обратите внимание, что команда вызывается оболочкой, поэтому если вам нужно передать команде оболочки какие-либо аргументы, поступающие из ненадежного источника, обязательно следует удалить или экранировать любые специальные символы, которые могут иметь для оболочки особое значение. По соображениям безопасности лучше всего использовать фиксированную командную строку или, по крайней мере, избегать передачи в нее каких-либо входных данных от пользователя.

STDIN

Указывает, что входные данные поступают из клиентского приложения.

STDOUT

Указывает, что выходные данные передаются в клиентское приложение.

логическое_значение

Указывает, должен ли выбранный параметр быть включен или выключен. Для включения параметра можно написать TRUE, ON или 1, а для выключения — FALSE, OFF или 0. Также логическое_значение можно опустить; в этом случае подразумевается TRUE.

FORMAT

Выбор формата данных для чтения или записи: text (текстовый), csv (Comma Separated Values, значения, разделенные запятыми) или binary (двоичный). По умолчанию стоит формат text.

FREEZE

Запрашивает копирование данных с уже замороженными строками, как это было бы после выполнения команды VACUUM FREEZE. Это позволяет увеличить производительность для начальной загрузки данных. Строки будут заморожены только в том случае, если загружаемая таблица была создана или опустошена в текущей субтранзакции, нет открытых курсоров и нет удерживаемых этой транзакцией старых снимков. В настоящее время невозможно выполнить COPY FREEZE для партиционированной таблицы.

Обратите внимание, что все остальные сеансы сразу же смогут увидеть данные, как только те будут успешно загружены. Это нарушает обычные правила видимости MVCC, и пользователи, включающие данный режим, должны понимать, какие проблемы это может вызвать.

DELIMITER

Задает символ, который разделяет столбцы в каждой строке файла. По умолчанию в текстовом формате используется символ табуляции, а внутри формата CSV — запятая. Это должен быть один однобайтовый символ. Для формата binary данный параметр не допускается.

NULL

Задает строку, представляющую собой значение NULL. Значение по умолчанию: \N (обратный слэш и N) в текстовом формате и пустая строка без кавычек в формате CSV. Если нет желания различать значения NULL и пустые строки, можно использовать пустую строку даже в текстовом формате. Для формата binary данный параметр не допускается.

Примечание
При использовании COPY FROM любой элемент данных, соответствующий этой строке, будет сохранен как значение NULL, поэтому следует убедиться, что вы используете ту же строку, что и в COPY TO.

HEADER

Указывает, что файл содержит строку заголовка с именами всех столбцов в файле. На выходе первая строка содержит имена столбцов из таблицы, а на входе первая строка игнорируется. Данный параметр разрешен только при использовании формата CSV.

QUOTE

Задает символ кавычки, который будет использоваться при вводе значения данных в кавычках. По умолчанию используются обычные кавычки (""). Это должен быть один однобайтовый символ. Данный параметр разрешен только при использовании формата CSV.

ESCAPE

Указывает символ, который должен отображаться перед символом данных, соответствующих значению QUOTE. Значение по умолчанию совпадает с QUOTE (так что если символ кавычки появляется в данных, он удваивается). Это должен быть один однобайтовый символ. Данный параметр разрешен только при использовании формата CSV.

FORCE_QUOTE

Принудительно заключает в кавычки все значения, отличные от NULL, в указанных столбцах. Выводимое значение NULL никогда не заключается в кавычки. Если указано *, значения не NULL будут заключены в кавычки во всех столбцах. Данный параметр разрешен только в COPY TO и только при использовании формата CSV.

FORCE_NOT_NULL

Не сопоставлять значения указанных столбцов с нулевой строкой. По умолчанию, когда нулевая строка пуста, это означает, что пустые значения будут считываться как строки нулевой длины, а не значения NULL, даже если они не заключены в кавычки. Данный параметр разрешен только в COPY FROM и только при использовании формата CSV.

FORCE_NULL

Сопоставлять значения указанных столбцов с нулевой строкой, даже если те были заключены в кавычки, и в случае совпадения устанавливать значение NULL. По умолчанию, когда нулевая строка пуста, это преобразует пустую строку в кавычках в значение NULL. Данный параметр разрешен только в COPY FROM и только при использовании формата CSV.

ENCODING

Указывает, что файл имеет кодировку имя_кодировки. Если этот параметр опущен, используется текущая клиентская кодировка. Более подробную информацию см. ниже в примечаниях.

WHERE

Необязательное предложение WHERE имеет общую форму

WHERE условие

где условие — это любое выражение, возвращающее результат типа boolean. Любая строка, которая не удовлетворяет этому условию, не будет добавлена в таблицу. Строка удовлетворяет условию, если она возвращает true при подстановке вместо ссылок на переменные фактических значений из этой строки.

В настоящее время выражения WHERE не могут включать подзапросы, а при вычислении выражений не видны изменения, которые вносит сама команда COPY (это имеет значение, когда в них вызываются функции с характеристикой VOLATILE).


Выводимая информация

После успешного завершения команда COPY возвращает метку команды в виде

COPY число

Где число — количество скопированных строк.

Примечание
psql будет выводить эту метку команды только в том случае, если выполняемой командой была не COPY ... TO STDOUT или ее аналог в psql, метакоманда \copy ... to stdout. Это сделано для того, чтобы не перепутать метку команды с выведенными перед ней данными.


Примечания

COPY TO можно использовать только с простыми таблицами, но не с представлениями, и эта команда не копирует строки из дочерних таблиц или партиций. Например, COPY таблица TO копирует те же строки, что и SELECT * FROM ONLY таблица. Чтобы выгрузить все строки представления, или таблицы с учетом иерархии наследования, или партиционированной таблицы, можно написать COPY (SELECT * FROM таблица) TO ...

COPY FROM можно использовать с простыми, сторонними или партиционированными таблицами или с представлениями, в которых установлены триггеры INSTEAD OF INSERT.

Нужно иметь право на выборку для таблицы, значения которой считываются COPY TO, и право на их добавление для таблицы, в которую значения добавляются COPY FROM. Однако если в команде перечисляются выбранные столбцы, достаточно иметь права только для них.

Если для таблицы включена защита на уровне строк, то соответствующие политики SELECT будут применяться и к операторам COPY таблица TO. В настоящее время COPY FROM не поддерживается для таблиц с защитой на уровне строк. Вместо этого используйте равнозначные операторы INSERT.

Файлы, заданные в команде COPY, считываются или записываются непосредственно сервером, а не клиентским приложением. Поэтому они должны располагаться на сервере базы данных или быть доступными для него, а не для клиента. Они должны быть доступны на чтение или запись пользователю QHB (идентификатору пользователя, под которым работает сервер), а не клиенту. Аналогично команда, указанная параметром PROGRAM, выполняется непосредственно сервером, а не клиентским приложением и должна быть доступна для выполнения пользователем QHB. Выполнять COPY с указанием файла или команды разрешено только суперпользователям базы данных или членам встроенных ролей pg_read_server_files, pg_write_server_files или pg_execute_server_program, так как они позволяют читать или записывать любые файлы и запускать любые программы, к которым имеет доступ сервер.

Не путайте COPY с командой psql \copy. Метакоманда \copy вызывает команду COPY FROM STDIN или COPY TO STDOUT, а затем извлекает/сохраняет данные в файле, доступном клиенту psql. Таким образом, при использовании \copy доступность файла и права доступа зависят от клиента, а не от сервера.

Рекомендуется, чтобы имя файла, используемое в COPY, всегда указывалось как абсолютный путь. Это обязательное условие для команды COPY TO, но для COPY FROM есть возможность чтения из файла, указанного относительным путем. Такой путь будет интерпретироваться относительно рабочего каталога серверного процесса (обычно это каталог данных кластера), а не рабочего каталога клиента.

Выполнение команды с помощью PROGRAM может быть ограничено механизмами контроля доступа операционной системы, такими как SELinux.

COPY FROM вызовет все триггеры и проверочные ограничения для целевой таблицы. Однако правила при загрузке данных не вызываются.

Для столбцов идентификации команда COPY FROM всегда будет записывать значения столбцов, указанные во входных данных, подобно параметру OVERRIDING SYSTEM VALUE команды INSERT.

При вводе и выводе данных COPY учитывается DateStyle. Чтобы обеспечить переносимость на другие установки QHB, которые могут использовать нестандартные настройки DateStyle, перед использованием COPY TO в DateStyle следует установить значение ISO. Также рекомендуется не выгружать данные при IntervalStyle равном sql_standard, так как сервер с другими значениями IntervalStyle может неправильно воспринимать значения отрицательных интервалов в таких данных.

Входные данные интерпретируются в соответствии с кодировкой, заданной параметром ENCODING, или текущей клиентской кодировкой, а выходные данные кодируются в кодировке ENCODING или текущую клиентской кодировке, даже если эти данные не проходят через клиент, а считываются или записываются в файл непосредственно сервером.

COPY останавливает работу при первой ошибке. Это не должно приводить к проблемам в случае COPY TO, но после COPY FROM в целевой таблице остаются ранее полученные строки. Эти строки не будут видны или доступны, но все равно будут занимать место на диске. Если сбой происходит при копировании большого объема данных, это может привести к значительным потерям дискового пространства. Восстановить потерянное пространство можно с помощью команды VACUUM.

FORCE_NULL и FORCE_NOT_NULL могут применяться одновременно к одному и тому же столбцу. В результате нулевые строки в кавычках будут преобразованы в значения NULL, а нулевые строки без кавычек — в пустые строки.


Форматы файлов

Текстовый формат

Когда используется формат text, данные читаются или записываются в виде текстового файла, строка в котором соответствует строке таблицы. Столбцы в строке разделяются символом-разделителем. Сами значения столбцов представляют собой текстовые строки, генерируемые функцией вывода либо принимаемые функцией ввода, соответствующей типу данных каждого атрибута. Вместо столбцов со значением NULL используется заданная нулевая строка. Если какая-либо строка входного файла содержит больше или меньше столбцов, чем ожидалось, COPY FROM выдает ошибку.

Конец данных может быть обозначен одной строкой, содержащей только обратный слэш и точку (\.). Маркер конца данных не является обязательным при чтении из файла, так как с его ролью вполне справляется конец файла; он необходим только при копировании данных в/из клиентских приложений, использующих клиентский протокол до версии 3.0.

Символы обратного слэша (\) в данных COPY позволяют экранировать символы данных, которые в противном случае могут быть приняты за разделители строк или столбцов. В частности, обратным слэшем должны предваряться следующие символы, если они оказываются частью значения столбца: сам обратный слэш, новая строка, возврат каретки и текущий символ разделителя.

Заданная нулевая строка передается командой COPY TO без добавления обратных слэшей; в то же время COPY FROM перед удалением обратных слэшей сопоставляет вводимые данные с нулевой строкой. Как следствие, нулевую строку, например \N, невозможно спутать с настоящим значением данных \N (которое должно быть представлено как \\N).

COPY FROM распознает следующие специальные последовательности с обратным слэшем:

ПоследовательностьЧто представляет
\bВозврат на символ (ASCII 8)
\fПодача формы (ASCII 12))
\nНовая строка (ASCII 10)
\rВозврат каретки (ASCII 13)
\tТабуляция (ASCII 9)
\vВертикальная табуляция (ASCII 11)
\цифрыОбратный слэш с последующими 1-3 восьмеричными цифрами задает байт с этим числовым кодом
\xцифрыОбратный слэш с последующим x и 1-2 шестнадцатеричными цифрами задает байт с этим числовым кодом

В настоящее время COPY TO никогда не выдает последовательности с обратным слэшем с восьмеричными или шестнадцатеричными кодами, однако эта команда использует для данных управляющих символов другие вышеперечисленные последовательности.

Любой другой символ после обратного слэша, который не упоминается в приведенной выше таблице, будет принят для представления самого себя. Однако остерегайтесь добавлять обратные слэши без необходимости, так как это может случайно привести к появлению строки, соответствующей маркеру конца данных (\.) или нулевой строке (по умолчанию \N). Эти строки будут восприняты раньше, чем обработаются любые последовательности с обратным слэшем.

Настоятельно рекомендуется, чтобы приложения, генерирующие данные для COPY, преобразовывали символы новой строки и возврата каретки в в последовательности \n и \r соответственно. В настоящее время возврат каретки в данных можно представить сочетанием обратного слэша и возврата каретки, а новую строку — сочетанием обратного слэша и новой строки. Однако эти представления могут не приниматься в будущих выпусках. Кроме того, они крайне уязвимы к повреждениям, если файл COPY переносится между разными системами (например, с Unix в Windows и наоборот).

Все последовательности с обратным слэшем интерпретируются после преобразования кодировки. Байты, заданные в этих последовательностях восьмеричными и шестнадцатеричными цифрами должны образовывать допустимые символы в кодировке базы данных.

COPY TO завершает каждую строку символом новой строки в стиле Unix («\n»). Серверы, работающие на Microsoft Windows, вместо этого выводят символы возврат каретки/новая строка («\r\n»), но только при выводе COPY в файл на сервере; для обеспечения согласованности между платформами COPY TO STDOUT всегда передает «\n» независимо от платформы сервера. COPY FROM может обрабатывать строки, заканчивающиеся символами новая строка, возврат каретки или возврат каретки/новая строка. Чтобы уменьшить риск ошибки из-за отсутствия обратного слэша перед символами новой строки и возврата каретки, которые должны были быть данными, COPY FROM сигнализирует о проблеме, если концы строк во входных данных различаются.


Формат CSV

Этот формат применяется для импорта и экспорта данных, разделенных запятой (Comma Separated Value, CSV), и используется многими другими программами, такими как электронные таблицы. Вместо правил экранирования, используемых стандартным текстовым форматом QHB, этот формат создает и распознает общий механизм экранирования CSV.

Значения в каждой записи разделяются символом DELIMITER. Если значение содержит символ разделителя, символ QUOTE, нулевую строку, символ возврата каретки или перевода строки, то все значение будет дополнено спереди и сзади символами QUOTE, а любое вхождение символа QUOTE или спецсимвола (ESCAPE) в данных предваряется управляющим символом. Также можно использовать FORCE_QUOTE, чтобы принудительно заключать в кавычки любые значения не NULL в указанных столбцах.

В формате CSV отсутствует стандартный способ отличить значение NULL от пустой строки. В QHB команда COPY решает это с помощью кавычек. Значение NULL выводится в виде строки, задаваемой параметром NULL, и не заключается в кавычки, тогда как значение не NULL, совпадающее со строкой, задаваемой параметром NULL, заключается. Например, с настройками по умолчанию NULL записывается в виде пустой строки без кавычек, в то время как пустое строковое значение данных записывается с кавычками (""). Чтение значений следует аналогичным правилам. Указание FORCE_NOT_NULL позволяет избежать сравнений с NULL во входных данных в заданных столбцах, а FORCE_NULL — преобразовывать в NULL даже заключенные в кавычки данные с нулевыми строками.

Так как обратный слэш не является специальным символом в формате CSV, маркер конца данных \. также может быть значением данных. Чтобы избежать любого неправильного толкования, значение данных \., отображаемое как одиночная запись в строке, автоматически заключается в кавычки при выводе, а при вводе этот маркер, заключенный в кавычки, не интерпретируется как маркер конца данных. Если вы загружаете файл, созданный другим приложением, который имеет один столбец без кавычек и может иметь значение \., потребуется дополнительно заключить это значение в кавычки во входном файле.

Примечание
В формате CSV все символы являются значимыми. Заключенное в кавычки значение, дополненное пробелами или любыми другими символами, кроме DELIMITER*, будет включать в себя эти символы. Это может привести к ошибкам при импорте данных из системы, дополняющей строки CSV пробельными символами до некоторой фиксированной ширины. В случае возникновения такой ситуации перед импортом данных в QHB может потребоваться предварительная обработка файла CSV для удаления конечного пробела.

Примечание
Формат CSV будет воспринимать и генерировать файлы CSV со значениями в кавычках, которые могут содержать символы возврата каретки и перевода строки. Таким образом, число строк в этих файлах не строго равно числу строк в таблице, как в файлах текстового формата.

Примечание
Многие программы создают странные и иногда неприемлемые файлы CSV, поэтому данный формат файла используется скорее по соглашению, чем по стандарту. Как следствие, можно столкнуться с некоторыми файлами, которые нельзя импортировать с помощью этого механизма, и COPY тоже может создавать файлы, которые другие программы не могут обрабатывать.


Двоичный формат

При выборе формата binary все данные сохраняются/считываются в двоичном, а не текстовом формате. Этот формат может обрабатываться несколько быстрее, чем текстовый и CSV форматы, но файл двоичного формата менее переносим в разных машинных архитектурах и версиях QHB. Кроме того, двоичный формат очень зависит для типа данных; например, он не позволит вывести двоичные данные из столбца smallint а затем прочитать их в столбец integer, хотя с текстовым форматом это вполне возможно.

Формат binary состоит из заголовка файла, нуля или более кортежей, содержащих данные строк, и окончания файла. Для заголовков и данных принят сетевой порядок байтов.


Заголовок файла

Заголовок файла состоит из 15 байт фиксированных полей, за которыми следует область расширения заголовка переменной длины. Фиксированные поля:

Сигнатура

11-байтовая последовательность PGCOPY\n\377\r\n\0 — обратите внимание, что нулевой байт является обязательной частью сигнатуры. (Сигнатура предназначена для облегчения идентификации файлов, которые были испорчены при передаче, не сохраняющей все 8 бит данных. Она изменится при прохождении через фильтры, меняющие концы строк, удалении нулевых байтов или старших битов либо при изменениях четности.)

Поле флагов

32-разрядная целочисленная битовая маска для обозначения важных аспектов формата файла. Биты нумеруются от 0 (LSB) до 31 (MSB). Обратите внимание, что это поле хранится в сетевом порядке байтов (наиболее значащий байт первый), как и все целочисленные поля, используемые в данном формате. Биты 16-31 зарезервированы, чтобы обозначить критичные проблемы формата; встретив неожиданный набор битов в этом диапазоне, обработчик должен прервать чтение. Биты 0-15 зарезервированы, чтобы сигнализировать о проблемах формата обратной совместимости; обработчик может просто игнорировать любые неожиданные наборы битов в этом диапазоне. В настоящее время определен только один битовый флаг, остальные должны быть равны 0:

  • Бит 16
    При 1 данные включаются в OID; при 0 — нет. В QHB больше не поддерживаются системные столбцы Oid, но формат все еще содержит этот индикатор.

Длина области расширения заголовка

32-битное целое число, длина в байтах остатка заголовка, не включая само это значение. В настоящее время содержит 0, и сразу за ним следует первая запись. Будущие изменения формата могут привести к появлению дополнительных данных в заголовке. Обработчик должен просто пропустить все данные расширения заголовка, с которыми он не знает, что делать.
.

Предполагается, что область расширения заголовка будет содержать последовательность самоидентифицирующихся фрагментов. Поле флагов не должно содержать указаний для обработчика о том, что содержится в области расширения. Точное содержимое области расширения может быть определено в будущих версиях.

Эта конструкция позволяет выполнять как обратно-совместимые добавления заголовков (добавлять блоки расширения заголовков или устанавливать младшие биты флагов), так и не обратно-совместимые изменения (устанавливать старшие биты флагов, чтобы сигнализировать о таких изменениях, и при необходимости добавлять вспомогательные данные в область расширения).


Кортежи

Каждый кортеж начинается с 16-битного целого числа, представляющего количество полей в записи. (В настоящее время все записи в таблице будут иметь одинаковое количество полей, но это может быть не всегда верно.) Затем для каждого поля в записи указывается 32-битное машинное слово, за которым следует это же количество байтов с данными поля. (Машинное слово не включает свой размер и может быть равно нулю.) В качестве особого варианта -1 обозначает, что в поле содержится значение NULL. В случае с NULL за длиной не следуют байты данных.

Между полями нет выравнивающих заполнителей или каких-либо других дополнительных данных.

В настоящее время предполагается, что все значения данных в файле двоичного формата содержатся в двоичном формате (формате под кодом один). Предполагается, что в будущем расширении в заголовок может быть добавлено поле, позволяющее задавать другие коды форматов для разных столбцов.

Чтобы определить подходящий двоичный формат для фактических данных, обратитесь к исходному коду QHB, в частности, к функциям send и recv для типов данных каждого столбца.

Если в файл включается идентификатор объекта (OID), поле OID следует сразу за числом, определяющим количество полей. Это обычное поле, за исключением того, что оно не учитывается в количестве полей. Обратите внимание, что системные столбцы oid не поддерживаются в текущих версиях QHB.


Окончание файла

Окончание файла состоит из 16-битного целого слова, содержащего -1. Это позволяет легко отличить его от счетчика полей в записи.

Обработчик, читающий файл, должен выдать ошибку, если число полей в записи не равно -1 или ожидаемому числу столбцов. Это обеспечивает дополнительную проверку на предмет нарушения синхронизации данных.


Примеры

В следующем примере таблица копируется в клиент с разделителем полей «вертикальная черта» (|):

COPY country TO STDOUT (DELIMITER '|');

Копирование данных из файла в таблицу country:

COPY country FROM '/usr1/proj/bray/sql/country_data';

Копирование в файл только данных стран, название которых начинается с «A»:

COPY (SELECT * FROM country WHERE country_name LIKE 'A%') TO '/usr1/proj/bray/sql/a_list_countries.copy';

Для копирования данных в сжатый файл можно направить вывод через внешнюю программу сжатия:

COPY country TO PROGRAM 'gzip > /usr1/proj/bray/sql/country_data.gz';

Пример данных, подходящих для копирования в таблицу из STDIN:

AF      AFGHANISTAN  
AL      ALBANIA  
DZ      ALGERIA  
ZM      ZAMBIA  
ZW      ZIMBABWE  

Обратите внимание, что пробел в каждой строке фактически является символом табуляции.

Ниже приведены те же данные, но выведенные в двоичном формате. Данные показаны после обработки Unix-утилитой od -c. Таблица содержит три столбца; первый имеет тип char(2), второй — text, а третий — integer. Последний столбец во всех строках содержит значение NULL.

0000000   P   G   C   O   P   Y  \n 377  \r  \n  \0  \0  \0  \0  \0  \0
0000020  \0  \0  \0  \0 003  \0  \0  \0 002   A   F  \0  \0  \0 013   A
0000040   F   G   H   A   N   I   S   T   A   N 377 377 377 377  \0 003
0000060  \0  \0  \0 002   A   L  \0  \0  \0 007   A   L   B   A   N   I
0000100   A 377 377 377 377  \0 003  \0  \0  \0 002   D   Z  \0  \0  \0
0000120 007   A   L   G   E   R   I   A 377 377 377 377  \0 003  \0  \0
0000140  \0 002   Z   M  \0  \0  \0 006   Z   A   M   B   I   A 377 377
0000160 377 377  \0 003  \0  \0  \0 002   Z   W  \0  \0  \0  \b   Z   I
0000200   M   B   A   B   W   E 377 377 377 377 377 377

Совместимость

В стандарте SQL нет команды COPY.