讓postgresql支持urlencode的gbk編碼功能 。

在pgsql-http這個插件中,有一個非常好用的功能,就是urlencode函數,可以將字符串進行url編碼。如

# select urlencode('123中國');
       urlencode       
-----------------------
 123%E4%B8%AD%E5%9B%BD
(1 row)

這個結果是正確的。但是我需要的是gbk字符集的urlencode結果。於是

# select urlencode(convert_to('123中中','gbk'));                                                                                                            
ERROR:  42883: function urlencode(bytea) does not exist                                                                                                           
LINE 1: select urlencode(convert_to('123中中','gbk'));

因爲參數不兼容,所以無法轉換。

於是,強制轉換

 # select urlencode(convert_to('123中中','gbk')::text);                                                                                                      
     urlencode                                                                                                                                                    
--------------------                                                                                                                                              
 %5Cx313233d6d0d6d0                                                                                                                                               
(1 row)

結果出來了,但是確是錯誤的結果。

---------------------------------------------------------------------------

解決辦法:

修改插件的http.sql文件.

增加一個重載函數。 
CREATE OR REPLACE FUNCTION urlencode(string bytea)
    RETURNS TEXT
    AS 'MODULE_PATHNAME'
    LANGUAGE 'c'
    IMMUTABLE STRICT;

或者,直接在psql中執行:

CREATE OR REPLACE FUNCTION urlencode(string bytea)                                                                                                        
    RETURNS TEXT                                                                                                                                                  
    AS '$libdir/http'                                                                                                                                             
    LANGUAGE 'c'                                                                                                                                                  
    IMMUTABLE STRICT;

就可以了。

這時,再執行,結果就正確了。

# select urlencode(convert_to('123中中','gbk'));
    urlencode    
-----------------
 123%D6%D0%D6%D0
(1 row)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章