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 распознает следующие специальные последовательности с обратной косой чертой:

ПоследовательностьПредставляет
\bBackspace (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.