COPY
COPY — копировать данные между файлом и таблицей
Синтаксис
COPY имя_таблицы [ ( имя_столбца [, ...] ) ]
FROM { 'имя_файла' | PROGRAM 'команда' | STDIN }
[ [ WITH ] ( параметр [, ...] ) ]
[ WHERE условие ]
COPY { имя_таблицы [ ( имя_столбца [, ...] ) ] | ( запрос ) }
TO { 'имя_файла' | PROGRAM 'команда' | STDOUT }
[ [ WITH ] ( параметр [, ...] ) ]
Где параметр может быть:
FORMAT имя_формата
FREEZE [ boolean ]
DELIMITER 'символ_разделитель'
NULL 'маркер_NULL'
HEADER [ boolean ]
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, данные передаются через соединение между клиентом и сервером.
Параметры
имя_таблицы
Имя существующей таблицы (может быть дополнено схемой).
имя_столбца
Необязательный список столбцов для копирования. Если список столбцов не указан, то будут скопированы все столбцы таблицы, кроме сгенерированных.
запрос
Команда SELECT, VALUES, INSERT, UPDATE или DELETE, результаты которой должны быть скопированы. Обратите внимание, что запрос заключается в круглые скобки.
Для запросов INSERT
, UPDATE
и DELETE
должно задаваться предложение RETURNING,
а целевое отношение не должно иметь
ни условного правила, ни правила ALSO, ни правила INSTEAD,
разворачивающегося в несколько операторов.
имя_файла
Путь к входному или выходному файлу. Путь входного файла может быть абсолютным или относительным путем, но путь выходного файла должен быть абсолютным путем. Пользователям Windows может потребоваться использование строки E'' и дублирование каждой обратной черты в пути файла.
PROGRAM
Выполняемая команда. COPY FROM
читает стандартный вывод команды, а COPY TO
записывает в ее стандартный ввод
Обратите внимание, что команда вызывается оболочкой, поэтому если вам нужно передать команде оболочки какие-либо аргументы, которые поступают из ненадежного источника, обязательно следует удалить или экранировать любые специальные символы, которые могут иметь особое значение для оболочки. По соображениям безопасности лучше всего использовать фиксированную командную строку или, по крайней мере, избегать передачи в нее любого пользовательского ввода.
STDIN
Указывает, что входные данные поступают из клиентского приложения.
STDOUT
Указывает, что выходные данные передаются в клиентское приложение.
boolean
Указывает, должен ли выбранный параметр быть включен или выключен. Для включения параметра можно написать TRUE, ON или 1, а для отключения — FALSE, OFF или 0. Значение boolean можно опустить; в этом случае подразумевается TRUE.
FORMAT
Выбор формата данных для чтения или записи: text (текстовый), csv (значения, разделенные запятыми (Comma Separated Values)) или binary (двоичный). По умолчанию стоит формат text.
FREEZE
Запрашивает копирование данных с уже замороженными строками, как это
было бы после выполнения команды VACUUM FREEZE
. Это позволяет увеличить производительность
для начальной загрузки данных. Строки будут заморожены только в том случае, если загружаемая
таблица была создана или очищена в текущей подтранзакции, нет открытых
курсоров и нет удерживаемых этой транзакцией старых снимков. В
настоящее время невозможно выполнить COPY FREEZE
для
партиционированной таблицы.
Обратите внимание, что все остальные сеансы сразу же смогут увидеть данные, как только те будут успешно загружены. Это нарушает обычные правила видимости MVCC, и пользователи, включающие данный режим, должны понимать, какие проблемы это может вызвать.
DELIMITER
Задает символ, который разделяет столбцы в каждой строке файла. По умолчанию используется символ табуляции в текстовом формате, запятая внутри формата CSV. Это должен быть один однобайтовый символ. Для формата binary данный параметр не допускается.
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. По умолчанию,
когда маркер пуст, это означает, что пустые значения
будут считываться как строки нулевой длины, а не значения NULL, даже
если они не заключены в кавычки. Данный параметр разрешен только в COPY FROM
и только при использовании формата CSV.
FORCE_NULL
Сопоставлять значения указанных столбцов с маркером NULL, даже если те
были заключены в кавычки, и в случае совпадения устанавливать значение NULL.
По умолчанию, когда маркер пуст, пустая строка в кавычках будет преобразовываться в NULL.
Данный параметр разрешен только в COPY FROM
и только при использовании формата CSV.
ENCODING
Указывает, что файл имеет кодировку имя_кодировки. Если этот параметр опущен, используется текущая клиентская кодировка. Более подробную информацию см. ниже в примечаниях.
WHERE
Необязательное предложение WHERE имеет общую форму
WHERE условие
где условие — это любое выражение, возвращающее результат типа boolean. Любая строка, которая не удовлетворяет этому условию, не будет добавлена в таблицу. Строка удовлетворяет условию, если она возвращает true при подстановке вместо ссылок на переменные фактических значений из этой строки.
В настоящее время выражения WHERE не могут включать подзапросы,
а при вычислении выражений не видны изменения, которые вносит сама команда COPY
(это имеет значение, когда в них вызываются функции с характеристикой VOLATILE).
Выводимая информация
После успешного завершения команда COPY
возвращает метку команды в виде
COPY число
Где число — количество скопированных записей.
Примечание
qsql будет печатать эту метку команды только в том случае, если выполнялась не командаCOPY ... TO STDOUT
или ее аналог в qsql, метакоманда\copy ... to stdout
. Это сделано для того, чтобы не перепутать метку команды с выведенными перед ней данными.
Примечания
COPY TO
можно использовать только с простыми таблицами, но не с
представлениями; также эта команда не копирует строки из дочерних таблиц или партиций. Например, COPY table TO
копирует те же строки, что и SELECT * FROM ONLY table
. Чтобы выгрузить все строки представления, или таблицы с учетом иерархии наследования, или
партиционированной таблицы, можно написать COPY (SELECT * FROM table) 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
с инструкцией qsql \copy. Метакоманда \\copy
вызывает функцию COPY FROM STDIN или COPY TO STDOUT, а затем
извлекает/сохраняет данные в файле, доступном клиенту qsql. Таким
образом, при использовании \\copy
доступность файла и права доступа зависят от
клиента, а не от сервера.
Рекомендуется, чтобы имя файла, используемое в COPY
, всегда
указывалось в качестве абсолютного пути. Это обязательное условие для команды
COPY TO
, но для COPY FROM
есть возможность
чтения из файла, указанного относительным путем. Такой путь будет
интерпретирован относительно рабочего каталога серверного процесса (обычно это
каталог данных кластера), а не рабочего каталога клиента.
Выполнение команды с помощью PROGRAM может быть ограничено механизмами контроля доступа операционной системы, такими как SELinux.
COPY FROM
вызовет все триггеры и проверочные ограничения для
целевой таблицы. Однако правила при загрузке данных не вызываются.
Для столбцов идентификации команда COPY FROM
всегда будет записывать
значения столбцов, указанные во входных данных,
подобно команде INSERT
с указанием OVERRIDING SYSTEM VALUE.
При вводе и выводе данных 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-значения в кавычках будут преобразованы в NULL, а NULL-значения без кавычек — в пустые строки.
Форматы файлов
Текстовый формат
Когда используется текстовый формат, данные читаются или записываются в виде
текстового файла, строка в котором соответствует строке таблицы. Столбцы в строке
разделяются символом-разделителем. Сами значения столбцов представляют собой
текстовые строки, выдаваемые функцией вывода либо воспринимаемые функцией ввода,
соответствующей типу данных столбца. Заданный маркер NULL используется
вместо столбцов со значением NULL. COPY FROM
выдает
ошибку, если какая-либо строка входного файла содержит больше или меньше
столбцов, чем ожидалось.
Конец данных может быть обозначен одной строкой, содержащей только обратную косую черту и точку (\.). Маркер конца данных не является обязательным при чтении из файла, так как его роль вполне выполняет конец файла; он необходим только при копировании данных в клиентские приложения или из клиентских приложений, использующих протокол pre-3.0 client.
Символы обратной косой черты (\) в данных COPY
позволяют экранировать символы данных,
которые в противном случае могут быть приняты за разделители строк или столбцов. В
частности, при появлении в качестве части значения столбца обратной косой чертой
должны предваряться следующие символы: сама обратная косая
черта, новая строка, возврат каретки и текущий символ разделителя.
Маркер NULL передается командой COPY TO
без добавления
обратной косой черты; в то же время COPY FROM
ищет во вводимых данных
маркеры NULL до удаления обратных косых черт. Как следствие, маркер NULL,
например \N, невозможно спутать с настоящим значением \N в данных
(которое должно представляться в виде \\N).
COPY FROM
распознает следующие специальные последовательности с обратной косой чертой:
Последовательность | Представляет |
---|---|
\b | Backspace (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
никогда не будет выдавать специальные последовательности
с восьмеричными или шестнадцатеричными кодами, однако эта команда
использует для данных управляющих символов другие вышеперечисленные последовательности.
Любой другой символ после обратной косой черты, который не упоминается в приведенной выше таблице, будет принят для представления самого себя. Однако остерегайтесь добавлять обратные косые черты без необходимости, так как это может случайно привести к появлению строки, соответствующей маркеру конца данных (\.) или маркеру NULL (\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
Этот формат применяется для импорта и экспорта данных, разделенных запятой (CSV), и используется многими другими программами, такими как электронные таблицы. Вместо правил экранирования, используемых стандартным текстовым форматом QHB, этот формат создает и распознает общий механизм экранирования CSV.
Значения в каждой записи разделяются символом DELIMITER. Если значение содержит символ разделителя, символ QUOTE, маркер NULL, символ возврата каретки или перевода строки, то всё значение будет дополнено спереди и сзади символами QUOTE, а любое вхождение символа QUOTE или спецсимвола (ESCAPE) в данных предваряется спецсимволом. Также можно использовать FORCE_QUOTE, чтобы принудительно заключать в кавычки любые значения не NULL в указанных столбцах.
В формате CSV отсутствует стандартный способ отличить значение NULL от
пустой строки. В QHB команда COPY
решает это с помощью кавычек.
Значение NULL выводится в виде строки, задаваемой параметром NULL,
и не заключается в кавычки, тогда как значение не NULL, совпадающее со строкой,
задаваемой параметром NULL, заключается. Например, с
настройками по умолчанию NULL записывается в виде пустой строки без кавычек,
в то время как пустое строковое значение данных записывается с
двойными кавычками (""). Чтение значений следует аналогичным правилам.
Указание FORCE_NOT_NULL позволяет избежать сравнений с NULL во входных
данных в заданных столбцах, а FORCE_NULL — преобразовывать в 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 за длиной не следуют байты данных.
Между полями нет выравнивания или каких-либо других дополнительных данных.
В настоящее время все значения данных в файле двоичного формата содержаться в двоичном формате (формате под кодом 1). Предполагается, что в будущем расширении в заголовок может быть добавлено поле, позволяющее задавать другие коды форматов для разных столбцов.
Чтобы определить подходящий двоичный формат для фактических данных, обратитесь к исходному коду QHB, в частности, к функциям send и recv для типов данных каждого столбца (обычно эти функции находятся в каталоге src/backend/utils/adt/ в дереве исходного кода).
Если в файл включается 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
.