If your $nullAs is '\\N', then you should use $nullAs as is in concatenation of cells of $rows, but send to pgsqlCopyFromArray() escaped version. Also fifth arg $fields should be a SQL-valid string for the column_names placeholder in COPY statement of PostgreSQL.I provide my smart wrapper for pgsqlCopyFromArray() which do this automatically.<?phpfunction pgInsertByCopy (PDO $db, $tableName, array $fields, array $records) { static $delimiter = "\t", $nullAs = '\\N'; $rows = []; foreach ($records as $record) { $record = array_map( function ($field) use( $record, $delimiter, $nullAs) { $value = array_key_exists($field, $record) ? $record[$field] : null; if (is_null($value)) { $value = $nullAs; } elseif (is_bool($value)) { $value = $value ? 't' : 'f'; } $value = str_replace($delimiter, ' ', $value); $value = addcslashes($value, "\0..\37"); return $value; }, $fields); $rows[] = implode($delimiter, $record) . "\n"; } return $db->pgsqlCopyFromArray($tableName, $rows, $delimiter, addslashes($nullAs), implode(',', $fields));}?>