最新消息:把Logo换了一下,虽然丑了点,但至少完全是自己的设计

PostgreSQL十进制和36进制的相互转换函数

PostgreSQL 宇托 935浏览 暂无评论

一直觉得ID不用数字,而用36进制的字符串比较好,所以就有了实现十进制转36进制函数的写法。在网上找了一下,PostgreSQL的写法如下:

十进制转36进制

代码如下,当然你也可以根据自己的要求修改:

SQL
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;

36进制转十进制

代码如下:

SQL
CREATE OR REPLACE FUNCTION base36_decode(IN base36 varchar)
  RETURNS bigint AS $$
        DECLARE
            a char[];
            ret bigint;
            i int;
            val int;
            chars varchar;
        BEGIN
        chars := '0123456789abcdefghijklmnopqrstuvwxyz';

        FOR i IN REVERSE char_length(base36)..1 LOOP
            a := a || substring(upper(base36) FROM i FOR 1)::char;
        END LOOP;
        i := 0;
        ret := 0;
        WHILE i < (array_length(a,1)) LOOP
            val := position(a[i+1] IN chars)-1;
            ret := ret + (val * (36 ^ i));
            i := i + 1;
        END LOOP;

        RETURN ret;

END;
$$ LANGUAGE 'plpgsql' IMMUTABLE;

参考地址:BASE36 CONVERSION IN POSTGRESQL

转载请注明:宇托的狗窝 » PostgreSQL十进制和36进制的相互转换函数

发表我的评论
取消评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址