Skip to content

adjust/pg-base62

Repository files navigation

CI

pg-base62

Base62 extension for PostgreSQL. The extension provides data types to encode and decode values using base62 encoding scheme.

Base62 uses 62 ASCII characters: 0 - 9, A - Z and a - z.

More information about base62 encoding scheme:

Types

base62

base62 stores encoded value in 4 bytes integer. The maximum length of string representation is 6 characters and maximum value of numeric representation is 2147483647.

-- Cast from text
=# select '2LKcb1'::base62::int;
    int4    
------------
 2147483647

-- Cast from integer
=# select 2147483647::base62;
 base62 
--------
 2LKcb1

=# select '1111111'::base62::int;
ERROR:  value "1111111" is out of range for type base62

-- The type is case sensitive
=# select '2lkcb'::base62::int, '2lkcb'::base62, '2LKCB'::base62::int, '2LKCB'::base62;
   int4   | base62 |   int4   | base62 
----------+--------+----------+--------
 40933305 | 2lkcb  | 34635195 | 2LKCB

bigbase62

bigbase62 stores encoded value in 8 bytes integer. The maxiumum length of string representation is 11 characters and the maximum value of numeric representation is 9223372036854775807.

-- Cast from text
=# select 'AzL8n0Y58m7'::bigbase62::bigint;
        int8         
---------------------
 9223372036854775807

-- Cast from integer
=# select 9223372036854775807::bigbase62;
  bigbase62  
-------------
 AzL8n0Y58m7

=# select '111111111111'::bigbase62::bigint;
ERROR:  value "111111111111" is out of range for type bigbase62

-- The type is case sensitive
=# select '2lkcb1'::bigbase62::bigint, '2lkcb1'::bigbase62, '2LKCB1'::bigbase62::bigint, '2LKCB1'::bigbase62;
    int8    | bigbase62 |    int8    | bigbase62 
------------+-----------+------------+-----------
 2537864911 | 2lkcb1    | 2147382091 | 2LKCB1

hugebase62

hugebase62 stores encoded value in 16 bytes integer. The maximum length of string representation is 20 characters.

It doesn't support casting from/to numeric type. Instead it support casting from/to bytea type. This is useful for applications to work with hugebase62.

-- Cast from text
=# select 'AzL8n0Y58m7AzL8n0Y58'::hugebase62;
      hugebase62      
----------------------
 AzL8n0Y58m7AzL8n0Y58

=# select 'AzL8n0Y58m7AzL8n0Y58'::hugebase62::bytea;
               bytea                
------------------------------------
 \x960c06065a6ed8ffff1e7149f40b1800

-- Cast from bytea
=# select '\x960c06065a6ed8ffff1e7149f40b1800'::bytea::hugebase62;
      hugebase62      
----------------------
 AzL8n0Y58m7AzL8n0Y58

=# select '111111111111111111111'::hugebase62;
ERROR:  value "111111111111111111111" is out of range for type hugebase62

-- The type is case sensitive
=# select '2lkcb1'::hugebase62::bytea, '2lkcb1'::hugebase62, '2LKCB1'::hugebase62::bytea, '2LKCB1'::hugebase62;
               bytea                | hugebase62 |               bytea                | hugebase62 
------------------------------------+------------+------------------------------------+------------
 \xcfbe4497000000000000000000000000 | 2lkcb1     | \x4b73fe7f000000000000000000000000 | 2LKCB1

Index support

All types support btree and hash indexes.

Installation from source codes

To install base62, execute this in the extension's directory:

make install

Notice: Don't forget to set the PG_CONFIG variable (make PG_CONFIG=...) in case you want to test base62 on a non-default or custom build of PostgreSQL. Read more here.

Important: To compile base62 your compiler should support 128-bit integers, otherwise it will fail during compilation.