【问题标题】:mysql - how to cast BINARY(4) as an integermysql - 如何将 BINARY(4) 转换为整数
【发布时间】:2024-01-22 00:56:01
【问题描述】:

我想获取 BINARY 字符串的前四个字节并将其解释为数字。

(背景:我有一个 SHA1 哈希,它已被 UNHEX'ed 到 BINARY(20) 列中,我想创建一个 PARTITION BY HASH 表达式,该表达式采用 SHA1 值的前四个字节并转换或转换它到一个数值,正如 PARTITION BY HASH 表达式所期望的那样。)

实际上不必是四个字节;只是一小部分字节,可以被处理成一个整数值。

【问题讨论】:

    标签: mysql hash casting binary


    【解决方案1】:

    我知道这已经晚了,但是,

    试试这个:

    SELECT CONV(LEFT(HEX(<column_with_bin_str>),8), 16, 10) FROM Table;
    

    这会将二进制字符串转换为十六进制,从转换后的字符串中取出前 8 个十六进制字符并将其转换为十进制。

    我们取前 8 个十六进制字符,因为需要两个十六进制字符来表示一个字节。

    【讨论】:

      【解决方案2】:

      您可以结合以下两个功能::

      SUBSTRING(str,pos,len)

      从字符串 str 返回一个子字符串 len 个字符长,从 位置pos。


      CONV(N,from_base,to_base) -

      在不同的数字基数之间转换数字。返回一个字符串 数字 N 的表示,从基数 from_base 转换为基数 to_base。


      编辑

      如果您需要获取10011001 的前 4 位数字,即1001 = 9,请使用:

      SELECT CONV(SUBSTR(10011001, 1, 4), 2, 10)
      

      如果你有前导零你可以使用LPAD函数,例如二进制值01001100的前4位数字是0100 = 4,你可以这样做:

      SELECT CONV(
        SUBSTR(
          LPAD(
            CAST(01001100 as char), (LENGTH(CAST(01001100 as char)) + 1), '0'), 
          1, 4), 2, 10)
      

      SQLFiddle

      【讨论】:

      • 关闭。我认为 CONV 希望 N 成为 ASCII 表示。正如我上面提到的,我正在使用一个真正的二进制“字符串”。这是我尝试过的: select conv(substr(unhex(sha1('a')),1,1),2,10);我会继续摆弄。