博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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