我与Postgres和Perl合作了十年。
我最古老的仍然操作的应用程序之一,政府地址和部门职责字典,处理包含重音字符的查询字词时遇到问题,例如köln
。换句话说,只要查询词包含重音字符(主要是变音符号),就会返回0个结果。
我必须提到这种行为只发生在使用Postgres作为数据库的这个应用程序。如果我切换到MySQL5(相同的数据)相同的查询正常工作。
尝试跟踪此问题的原因我已检查过以下内容:
show server_encoding;
)show client_encoding;
)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 repo中的代码相比)它只是HTML UTF8 -Header print "Content-type: text/html; charset=utf-8\n\n";
和一些不相关的模板部分。也许这个地方的变化是所有问题的根源,但我不知道是什么意思。调整Postgres。
当前的Perl版本是5.22.1,使用的是Apache / 2.2.22(Ubuntu)。 vhost配置很简单:
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
。
EDIT2:
使用DBD::Pg
标记pg_enable_utf8
并将其设置为0
似乎工作正常,我得到了预期的结果。使用0
以外的值,例如'-1 or
1`不起作用。我在数据库连接后立即尝试了那个标志(再一次)。实际上我必须验证这一点,因为我仍然不明白发生了什么。