在数据库存储中,如果以数字作为排序的基准的话,那么用NUMBER类型是可以的。但是如果是以字符串作为排序的基准的话,那么将数字转为36进制是更好的选择。ORACLE的ROWID其实就是36进制的字符串。
36进制其实就是[0~9]和[A~Z]的集合。36进制比16进制的空间利用率更高。
下面是将10进制数字转换为36进制的ORACLE函数。
CREATE OR REPLACE FUNCTION TRANS10TO36(BINARY_NUM NUMBER, OUT_LENGTH NUMBER)RETURN VARCHAR AS
RET VARCHAR(100);
X NUMBER;
N NUMBER;
L VARCHAR(36);
BEGIN
IF(BINARY_NUM IS NULL) THEN
IF(OUT_LENGTH IS NULL) THEN
RETURN NULL;
ELSE
RETURN LPAD('0',OUT_LENGTH, '0');
END IF;
END IF;
L := '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
X := BINARY_NUM;
LOOP
N := MOD(X, 36);
RET := CONCAT(SUBSTR(L, ABS(N) + 1, 1) , RET);
X := TRUNC(X / 36);
EXIT WHEN X = 0;
END LOOP;
IF(OUT_LENGTH IS NOT NULL AND LENGTH(RET) < OUT_LENGTH) THEN
RET := LPAD(RET, OUT_LENGTH, '0');
END IF;
IF(BINARY_NUM < 0) THEN
RET := '-' || RET;
END IF;
RETURN RET;
END TRANS10TO36;