2

我使用 Postgres 和 Perl 已经十年了。

我仍在运行的最古老的应用程序之一,政府地址和部门职责字典,在处理包含重音字符的查询术语时遇到问题,例如köln. 换句话说,只要查询词包含重音字符(主要是变音符号),就会返回 0 个结果。

我不得不提一下,这种行为只有在使用 Postgres 作为数据库的应用程序时才会发生。如果我切换到 MySQL5(相同数据)相同的查询工作正常。

试图跟踪此问题的原因,我检查了以下内容:

  • Postgres 数据库是 UTF-8(使用命令show server_encoding;
  • Postgres 客户端编码也是 UTF8(使用show client_encoding;
  • 如果我使用 Postgres 监视器并执行与应用程序相同的 SQL 查询,在查询词中使用重音字符,我会得到正确的结果
  • Perl 应用程序本身正在处理 UTF-8,HTML-Header 设置正确,输出内容显示正确且无乱码
  • 所有 Perl 代码文件、脚本、.pm 包文件和模板都是 UTF-8 编码的(我用 验证过file --mime perl_file_name
  • 我摆弄数据库连接,设置$self->{dbh}->{pg_enable_utf8} = 1;或/和$self->{dbh}->do("SET CLIENT_ENCODING TO 'UTF8';");或/和$self->{dbh}->do("SET NAMES 'UTF8';");没有变化
  • 我已经更新DBD::Pg module到 3.6.2 版,没有变化。

所以我几乎不知道还有什么要检查或尝试让 Postgres 充分工作。就像我在介绍中提到的那样,仅使用 MySQL 作为数据库的同一个应用程序可以完美运行。

2 年前,应用程序被更改为处理 UTF-8 数据,我自己并没有进行更改,但据我在代码中看到的(与我的 GIT 存储库中的代码相比)它只是 HTML UTF8-Headerprint "Content-type: text/html; charset=utf-8\n\n";和一些不相​​关的模板部分。也许某处的这种变化是所有问题的根源,但我不知道特别是什么。为 Postgres 进行调整。

当前的 Perl 版本是 5.22.1,使用 Apache/2.2.22 (Ubuntu)。虚拟主机配置很简单:

AddHandler cgi-script .cgi .pl
ScriptAlias /...abs-path-to-app.../cgi-bin/
<Directory "/...abs-path-to-app.../cgi-bin/">
     AllowOverride None
     Options +Indexes +ExecCGI +MultiViews +SymLinksIfOwnerMatch
     <IfVersion < 2.4>
         Allow from all
     </IfVersion>
     <IfVersion >= 2.4>
         Require all granted
     </IfVersion>
     Allow from all
</Directory>

Postgres 版本为 9.1.24。

编辑:

CollateCtype设置为en_US.UTF-8,为相关数据库Encoding设置UTF-8为 。查看表格,所有character varying列都使用pg_catalog."default"排序规则。执行show lc_collate;节目已经提到en_US.UTF-8

编辑2:

使用DBD::Pg标志pg_enable_utf8并将其设置为0似乎可行,我得到了预期的结果。使用 以外的值0,例如 '-1 1'or不起作用。我在数据库连接后立即尝试了该标志(再次)。实际上我必须验证这一点,因为我仍然不明白发生了什么。

4

0 回答 0