標籤:
35進位的目的是防止0和O造成的視覺誤差
BEGIN
DECLARE m_StrHex35 VARCHAR(100); -- 返回35進位表示的結果
DECLARE m_Remainder BIGINT; -- 餘數
DECLARE m_Base35 VARCHAR(1);
SET m_Remainder=0;
SET m_StrHex35=‘‘;
WHILE p_Hex10>=35 DO
SET m_Remainder=p_Hex10%35;
SET p_Hex10=(p_Hex10-m_Remainder)/35;
SET m_Base35=SUBSTRING(‘0123456789ABCDEFGHIJKLMNPQRSTUVWXYZ‘,m_Remainder+1,1);
SET m_StrHex35=CONCAT(m_Base35,m_StrHex35);
END WHILE;
SET m_Remainder=p_Hex10%35;
SET m_Base35=SUBSTRING(‘0123456789ABCDEFGHIJKLMNPQRSTUVWXYZ‘,m_Remainder+1,1);
SET m_StrHex35=CONCAT(m_Base35,m_StrHex35);
-- PRINT @StrHex35
RETURN m_StrHex35;
END
BEGIN
DECLARE m_StrHex35Len INT ; -- 被轉換35進位字串的長度
DECLARE m_Base35To10 INT ; -- 每位35進位基數對應的10進位資料大小
DECLARE m_Index INT ; -- 字串索引
DECLARE m_Hex10 BIGINT ; -- 被返回10進位資料
DECLARE m_Base35 VARCHAR(1) ; -- 35進位基數
DECLARE m_Middle_Data BIGINT;
SET m_Hex10=0;
SET m_StrHex35Len=LENGTH(p_StrHex35);
SET m_Index=1;
WHILE (m_Index<=m_StrHex35Len) DO
SET m_Base35=SUBSTR(p_StrHex35 from m_Index for 1);
SET m_Base35To10= LOCATE(m_Base35,‘0123456789ABCDEFGHIJKLMNPQRSTUVWXYZ‘) - 1;
-- 注意:這裡必須先把Power的值儲存到一個變數,不能計算的結果直接乘一個另外的變數,這樣會造成計算結果不正確
SET m_Middle_Data = POWER(35,m_StrHex35Len-m_Index);
SET m_Hex10=m_Hex10+m_Base35To10 * m_Middle_Data;
SET m_Index=m_Index+1;
END WHILE;
RETURN m_Hex10;
END
mysql 10進位與35進位之間的轉換 注意Power處理bigint的問題