Postgres 9.0 +翻译函数和ascii代码

时间:2012-04-13 06:39:34

标签: postgresql escaping standards

我使用translate函数处理重音不敏感的搜索。 为了改进这个请求,我创建了一个匹配的索引:

CREATE INDEX person_lastname_ci_ai_si
ON person
USING btree
(translate(upper(lastname::text), '\303\200\303\201\303\202\303\203\303\204\303\205\303\206\303\207\303\210\303\211\303\212\303\213\303\214\303\215\303\216\303\217\303\221\303\222\303\223\303\224\303\225\303\226\303\230\303\231\303\232\303\233\303\234\303\235\303\237\303\240\303\241\303\242\303\243\303\244\303\245\303\246\303\247\303\250\303\251\303\252\303\253\303\254\303\255\303\256\303\257\303\261\303\262\303\263\303\264\303\265\303\266\303\270\303\271\303\272\303\273\303\274\303\275\303\277'::text, 'AAAAAAACEEEEIIIINOOOOOOUUUUYSaaaaaaaceeeeiiiinoooooouuuuyy'::text)
);

它适用于postgres 9.1但它似乎不适用于9.0。 Postgres 9.0似乎取代了

'\303\200\303\201\303\202\303\203\303\204\303\205\303\206\303\207\303\210\303\211\303\212\303\213\303\214\303\215\303\216\303\217\303\221\303\222\303\223\303\224\303\225\303\226\303\230\303\231\303\232\303\233\303\234\303\235\303\237\303\240\303\241\303\242\303\243\303\244\303\245\303\246\303\247\303\250\303\251\303\252\303\253\303\254\303\255\303\256\303\257\303\261\303\262\303\263\303\264\303\265\303\266\303\270\303\271\303\272\303\273\303\274\303\275\303\277'

通过

ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïñòóôõöøùúûüýÿ

然后,因为我的代码使用ascii代码执行搜索,所以它不使用索引..

有没有办法避免postgres在创建索引时将ascii代码转换为字符?

例如:

select '\303\200\303\201\303\202\303\203\303\204\303\205\303\206\303\207\303\210\303\211\303\212\303\213\303\214\303\215\303\216\303\217\303\221\303\222\303\223\303\224\303\225\303\226\303\230\303\231\303\232\303\233\303\234\303\235\303\237\303\240\303\241\303\242\303\243\303\244\303\245\303\246\303\247\303\250\303\251\303\252\303\253\303\254\303\255\303\256\303\257\303\261\303\262\303\263\303\264\303\265\303\266\303\270\303\271\303\272\303\273\303\274\303\275\303\277'

结果

ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïñòóôõöøùúûüýÿ

我怎么能得到这个结果?

\303\200\303\201\303\202\303\203\303\204\303\205\303\206\303\207\303\210\303\211\303\212\303\213\303\214\303\215\303\216\303\217\303\221\303\222\303\223\303\224\303\225\303\226\303\230\303\231\303\232\303\233\303\234\303\235\303\237\303\240\303\241\303\242\303\243\303\244\303\245\303\246\303\247\303\250\303\251\303\252\303\253\303\254\303\255\303\256\303\257\303\261\303\262\303\263\303\264\303\265\303\266\303\270\303\271\303\272\303\273\303\274\303\275\303\277

1 个答案:

答案 0 :(得分:1)

从版本9.1开始,PostgreSQL standard_conforming_strings选项默认为ON

这意味着反斜杠\字符被视为原样而不是转义符号,这样做是为了防止SQL注入攻击;这遵循SQL标准的建议。 仍然可以使用\来获取特殊字符,但仅限于string constants

对于9.1版之前的PostgreSQL版本,我认为这些选项是可能的:

  1. 将系统级standard_conforming_strings选项更改为ON,但这会影响整个群集,并可能在其他方面产生意外结果;

  2. 使用standard_conforming_strings更改per-user basis上的ALTER ROLE ... SET standard_conforming_strings TO on;选项,此选项也可能有副作用;

  3. 在创建索引之前,使用普通SET standard_conforming_strings TO on;作为您在会话中发出的第一个命令;

  4. 将所有反斜杠加倍,以便在\声明中将其视为文字CREATE INDEX ...符号。

  5. 如果有帮助,请告诉我。