Postgres查询工作在9.0但不在9.2

时间:2014-08-21 18:21:42

标签: postgresql postgresql-9.2

我在我的postgres 9.2

上尝试此查询
SELECT ar.nome_defensor, count(*)
FROM sirdp.atividade_realizadas ar
INNER JOIN sirdp.naturezas n on n.id = ar.natureza_id
INNER JOIN sirdp.atividades at on at.id = n.atividade_id
WHERE ar.data_atividade between '01/08/2011' and '31/08/2014'
    and ar.local_atuacao_defensor in ('1ª Vara de Acara\303\272')
group by ar.nome_defensor
order by ar.nome_defensor

它不起作用,但在9.0上它可以工作。

我认为它与参数1ª Vara de Acara\303\272有关,因为问题在于重音词。

两个数据库都有此配置:

   ENCODING = 'UTF8'
   TABLESPACE = pg_default
   LC_COLLATE = 'pt_BR.UTF-8'
   LC_CTYPE = 'pt_BR.UTF-8'
   CONNECTION LIMIT = -1;

1 个答案:

答案 0 :(得分:1)

  

我认为它有参数:1ªVarade Acara \ 303 \ 272   因为问题在于重音词。

是。 Postgresql 9.0和之前的配置参数standard_conforming_strings默认设置为OFF,这意味着这个字符串文字:

'1ª Vara de Acara\303\272'

在UTF-8编码的上下文中被解释为:1ª Vara de Acaraú

自PostgreSQL 9.1以来,默认情况下此standard_conforming_strings已经变为ON,所以现在反斜杠被解释为反斜杠。这在the documentation

中有解释
  

standard_conforming_strings(boolean)       这控制普通的字符串文字('...')是否按字面意思处理反斜杠,如SQL标准中所规定的那样。从...开始   PostgreSQL 9.1,默认打开(先前版本默认为关闭)。   应用程序可以检查此参数以确定字符串文字的方式   将被处理。此参数的存在也可以视为   表示支持转义字符串语法(E'...')。   如果是,则应使用转义字符串语法(第4.1.2.2节)   application希望反斜杠被视为转义字符。

你可以通过以下方式逃避:

  • 在查询中直接使用1ª Vara de Acaraú。毕竟,ª字符已不在US-ASCII范围内,因此提交查询的方法已经支持重音。
  • 在查询中使用E'1ª Vara de Acara\303\272'
  • 不更改查询,但将standard_conforming_strings设置为OFF以切换回PostgreSQL 9.0及以前版本的行为。