我使用 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。
编辑:
Collate
并Ctype
设置为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
不起作用。我在数据库连接后立即尝试了该标志(再次)。实际上我必须验证这一点,因为我仍然不明白发生了什么。