2012-04-13 55 views
1

我使用翻譯功能處理搜索重音不敏感。 爲了改善這種要求,我創建了一個匹配指數:Postgres 9.0 +翻譯功能和ASCII代碼

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

從版本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. 在創建索引之前,使用plain SET standard_conforming_strings TO on;作爲您在會話中發出的第一個命令;

  4. 將所有反斜槓加倍,以便在您的CREATE INDEX ...語句中將其視爲文字\符號。

讓我知道這是否有幫助。

+0

感謝您的幫助。選擇'\ 303 \ 200 \ 303 \ 201 \ 303 \ 202 \ 303 \(...)'return'\ 303 \ 200 \ 303 \ 201 \ 303 \ 202 \ 303 \(...)' - >好。但創建索引person_firstnamebegin_ci_ai_si ON person USING btree(translate(substr(upper(replace(firstname :: text,'':: text,'':: text)),1,1),'\\ 303 \\ 200 \\ 303 \\ 201 \\ 303 \\ 202 \\ 303 \\ 203 \\ 303 \\ 204 \\ 303(...)使用雙斜槓值而不是簡單斜槓創建索引,即使我使用單斜槓創建索引 – 2012-04-13 11:40:24

+0

PGADMIN使用雙斜槓而不是簡單斜槓顯示索引,但我的搜索使用已創建的索引。謝謝你的幫助 – 2012-04-13 11:51:50