1

我使用翻译功能来处理不区分重音的搜索。为了改进这个请求,我创建了一个匹配索引:

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
4

1 回答 1

1

从 9.1 版开始,PostgreSQLstandard_conforming_strings选项默认为ON.

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

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

  1. 将系统范围的standard_conforming_strings选项更改为ON,但这会影响整个集群,并可能在其他区域产生意想不到的结果;

  2. 根据每个用户更改standard_conforming_strings选项,使用,这个也可能有副作用;ALTER ROLE ... SET standard_conforming_strings TO on;

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

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

让我知道这是否有帮助。

于 2012-04-13T09:58:03.383 回答