-1

我正在使用 Perl 和 Perl DBI 将大量数据输入到 PostgreSQL 数据库中。由于我的文件编码不正确,我遇到了错误。我将 PostgreSQL 编码设置为 'utf8' 并使用 debian 'file' 命令确定我的文件具有“非 ISO 扩展 ASCII 文本,行很长,带有 CRLF 行终止符”,并且当我运行我的程序时DBI 由于“无效的字节序列”而失败。我已经在我的 Perl 程序中添加了一行来替换 '\r' 回车符,但是我怎样才能将我的文件转换为 'utf8' 或让 PostgreSQL 接受我的文件编码。谢谢。

4

1 回答 1

1

当您使用连接到 PostgreSQLDBI->connect(..., { pg_enable_utf8 => 1})时,所有修改 DBI 调用中使用的数据(SQL INSERTUPDATEDELETE、在查询中使用占位符的任何地方等)都必须以 Perl 的内部编码进行编码,以便 DBI 本身可以正确转换为有线协议。

有很多方法可以实现这一点,它们都取决于你首先阅读文件的方式。最基本的一种是如果您使用open(或直接基于它的方法之一,例如IO::File->open)。然后,您可以使用 Perl 的 I/O 层(请参阅open上面的链接)并让 Perl 为您完成。假设您的文件已经以 UTF-8 编码,您将摆脱:

open(my $fh, "<:encoding(UTF-8)", "filename");
while (my $line = <$fh>) {
  # process query
}

这基本上相当于在没有编码层的情况下打开文件并使用 手动转换Encode::decode,例如:

open(my $fh, "<", "filename");
while (my $line = <$fh>) {
  $line = Encode::decode('UTF-8', $line);
  # process query
}

许多从外部源接收数据并返回的其他模块(例如使用 的 HTTP 下载LWP)返回的值已经转换为 Perl 的内部编码。

所以你要做的是:

  • 找出您的文件实际使用的编码(尝试iconv在 shell 上使用)
  • 告诉 DBI 启用 UTF-8
  • 使用正确的编码打开文件
  • 读取行,处理查询,重复
于 2013-08-25T07:48:21.600 回答