如果您的 $nullAs 是 '\\N',那么您应该在 $rows 的单元格连接中按原样使用 $nullAs,但发送到 pgsqlCopyFromArray() 时应使用转义版本。 此外,第五个参数 $fields 应该是一个有效的 SQL 字符串,用于 PostgreSQL 中 COPY 语句中的 column_names 占位符。
我提供了一个 pgsqlCopyFromArray() 的智能包装器,它可以自动执行此操作。
<?php
function 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));
}
?>