使用postgres

时间:2017-08-11 07:13:46

标签: mysql apache postgresql perl dbd-pg

我与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 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。

修改

CollateCtype设置为en_US.UTF-8Encoding对于相关数据库设置为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`不起作用。我在数据库连接后立即尝试了那个标志(再一次)。实际上我必须验证这一点,因为我仍然不明白发生了什么。

0 个答案:

没有答案