2011-05-13 72 views

回答

9

有64个基本功能(如encode),但基本-36没有。但是,你可以写你自己的一个或use this one(注意,该链接是死的,我会离开它,因为它是我唯一的归属):

CREATE OR REPLACE FUNCTION base36_encode(IN digits bigint, IN min_width int = 0) RETURNS varchar AS $$ 
DECLARE 
    chars char[]; 
    ret varchar; 
    val bigint; 
BEGIN 
    chars := ARRAY['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z' 
    ]; 
    val := digits; 
    ret := ''; 
    IF val < 0 THEN 
     val := val * -1; 
    END IF; 
    WHILE val != 0 LOOP 
     ret := chars[(val % 36)+1] || ret; 
     val := val/36; 
    END LOOP; 

    IF min_width > 0 AND char_length(ret) < min_width THEN 
     ret := lpad(ret, min_width, '0'); 
    END IF; 

    RETURN ret; 
END; 
$$ LANGUAGE plpgsql IMMUTABLE; 

我想你应该问自己,如果数据库是处理这种数据格式的正确地方,但是像这样的表现问题可能会更好地处理到接近堆栈的最终查看级别。

+0

不幸的是,链接的博客已经死亡。你不会有这样一个算法,准备用一个更长的数字来表示一个'IN digits digitsa'表示吗? :-) – 2013-10-02 15:09:48

+0

@LukasEder:我不确定你在问什么。你有一个'bytea'列,你想在数据库中编码为base-36? – 2013-10-02 16:55:12

+0

是的,或多或少。我已经重写了这个功能,同时...... – 2013-10-02 19:01:32