作为表名,您也可以指定要导入的列。
将导入所有列
<?php
pg_copy_from($db, 'cpm.ics', $rows);
?>
将仅导入指定的列
<?php
pg_copy_from($db, 'cpm.ics (type, product, date, count, amount)', $rows);
?>
(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)
pg_copy_from — 从数组中插入记录到表中
$connection
,$table_name
,$rows
,$separator
= "\t",$null_as
= "\\\\N"
pg_copy_from() 从 rows
中将记录插入到表中。它在内部发出 COPY FROM
SQL 命令来插入记录。
connection
一个 PgSql\Connection 实例。
table_name
要将 rows
复制到的表的名称。
rows
要复制到 table_name
中的数据的 array。rows
中的每个值都成为 table_name
中的一行。rows
中的每个值都应该是一个分隔符字符串,用于插入到每个字段中的值。值应该以换行符结尾。
separator
rows
中每个元素的每个字段中用于分隔值的标记。默认值为 \t
。
null_as
在 rows
中如何表示 SQL NULL
值。默认值为 \\N
("\\\\N"
)。
版本 | 描述 |
---|---|
8.1.0 | connection 参数现在需要一个 PgSql\Connection 实例;以前需要一个 resource。 |
示例 #1 pg_copy_from() 示例
<?php
$db = pg_connect("dbname=publisher") or die("Could not connect");
$rows = pg_copy_to($db, $table_name);
pg_query($db, "DELETE FROM $table_name");
pg_copy_from($db, $table_name, $rows);
?>
作为表名,您也可以指定要导入的列。
将导入所有列
<?php
pg_copy_from($db, 'cpm.ics', $rows);
?>
将仅导入指定的列
<?php
pg_copy_from($db, 'cpm.ics (type, product, date, count, amount)', $rows);
?>
要解决参数 $separator 和 $null_as 需要使用多少个反斜杠的问题:反斜杠会解释两次,第一次由 PHP 解释,然后由 PostgreSQL 解释。所以写四个反斜杠来表示输入数据中的一个反斜杠。因此,\\\\N 和 \\\\N 都变为 NULL AS E'\\N',在内部使用的 SQL 语句中与 NULL AS '\N' 意义相同。
加载的输入数据必须使用反斜杠转义。根据 PostgreSQL 文档,您可以使用以下转义序列
\\ = 反斜杠 (ASCII 92)
\b = 退格键 (ASCII 8)
\t = 制表符 (ASCII 9)
\n = 换行符 (ASCII 10)
\v = 垂直制表符 (ASCII 11)
\f = 换页符 (ASCII 12)
\r = 回车符 (ASCII 13)
\000 (反斜杠后跟一个到三个八进制数字) = 具有该数字代码的字节
\x00 (反斜杠 x 后跟一个或两个十六进制数字) = 具有该数字代码的字节
使用默认设置,仅包含 \N(一个未转义的反斜杠和一个 N)的数据字段表示 NULL 值。此默认值 \N 被选中是因为它不会与正确编码的数据冲突。
使用此函数时,不要被双引号 (") 与单引号 (') 的区别困扰。这是一个小问题,但错误消息会误导人。如果您使用单引号,您将看到 \t 分隔的值都尝试插入到第一个字段中。
一个小小的考虑,但可以帮助那些工作到很晚,无法让这些函数正常工作的人。
从 postgresql 9.1 开始,"standard_conforming_strings" 设置为 on
这将不再起作用
<?php
$copy_message = "1\t\\N\t300";
pg_copy_from($db, "message", $copy_message);
?>
结果将在该字段中为 "N"。如果该字段允许文本,否则它将无法插入帖子。
简单的修复
<?php
$copy_message = "1\t\\NULL\t300";
pg_copy_from($db, "message", $copy_message, "\t","\\NULL");
?>
需要说明一下数组的格式。
从我所见来看,它几乎与您使用
file() 加载分隔符为制表符的文件时获得的结果相同。也就是说,
行以换行符结尾,并且不需要
带有 "\." 的额外行。另一方面,当我尝试使用此
命令时,与服务器的连接最终处于某种奇怪的
状态,然后丢失
PHP 警告: U?S?o() 查询失败: 服务器意外关闭连接
我认为现在使用较低级别的函数
pg_put_line() 可能会更安全。
修复“复制命令失败: ERROR: 在数据中发现字面回车符
或
"复制命令失败: ERROR: 缺少列的数据
"message" CONTEXT: COPY message, line 1:"
<?php
$message = "HEJ\rHEJ\nHEJ\r\nHEJ\n\rHEJ\tHELLO\\";
$message = addslashes($message);
$message = str_replace(
array("\n","\r","\t"),
array("\\n","\\r","\\t"),
$message);
$copy_message = "1\t". $message ."\t300";
pg_copy_from($db, "message", $copy_message);
?>