【问题标题】:Change file encoding for PostgreSQL w/Perl使用 Perl 更改 PostgreSQL 的文件编码
【发布时间】:2013-08-27 20:23:18
【问题描述】:

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

【问题讨论】:

  • file 无法可靠地检测到编码。您实际上需要知道什么是文本编码,以便正确转换它。如果您真的不知道,请尝试使用比file 更强大的编码检测工具。

标签: perl postgresql encoding utf-8


【解决方案1】:

当你 connect to PostgreSQL 使用 DBI->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
}

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

所以你要做的是:

  • 找出你的文件实际使用的编码(尝试在 shell 上使用iconv
  • 告诉 DBI 启用 UTF-8
  • 使用正确的编码打开文件
  • 读取行,处理查询,重复

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多