您如何将整数转换为其CONDENSED二进制等价物,例如MySQL中的BINARY(3)

问题描述 投票:0回答:1

我正在执行哈希操作,我需要一致,准确,高效地添加原始字节等。我无法处理ASCII编码的数字字符串,只需要获取原始字节即可。

MySQL的转换功能非常令人困惑,并且不会产生像我这样的SQL Server家伙似乎显而易见的结果。

例如,BINARY 123456产生一个包含6个字符的ASCII编码字符串,而不是看似明显的BINARY ( 3 )字符串00000001 11100010 010000000x01E240

到目前为止,获得正确转换的唯一方法是分配一个十六进制文字,这在运行时显然是不切实际的。

SET @int_value = 123456 ;   -- Decimal value

SET @hex_value = 0x01E240 ; -- The same value, in hexadecimal,
                            -- 6 hex digits = 3 bytes

SELECT LENGTH ( BINARY @int_value ) , LENGTH ( BINARY @hex_value ) , LENGTH ( BINARY HEX ( @int_value ) ) ;

enter image description here

因此,在此示例中,如何将整数值(例如DECLARE的整数变量或整数列)123456转换为3个字节的字符串?

编辑:根据注释中的要求,SQL-Server默认情况下会产生所需的结果:

enter image description here

这是我需要在MySQL中模仿的行为。

mysql sql binary type-conversion data-conversion
1个回答
2
投票

CHAR功能可能就是您想要的。(除非有我不知道的更好的方法。)

CHAR使您可以指定一系列整数,并将它们全部转换为该整数表示的ASCII字符。

因此,基本上,只要您的整数为<= 255,CHAR实际上不会修改任何东西,除了让MySQL将整数当作“字符串”中的“字符”之外。

以某种分割,一点点MOD动作和瞧瞧将其组合起来!

(只需使用TRIM删除前导0字节,您便拥有了三个字节的字符串。)

CREATE FUNCTION convert_unsigned_int_binary(input INT UNSIGNED)
RETURNS BINARY(4) DETERMINISTIC NO SQL RETURN
    CHAR (FLOOR(input/16777216),
          MOD(FLOOR(input/65536), 256),
          MOD(FLOOR(input/256), 256),
          MOD(input, 256));

CREATE FUNCTION convert_int_binary(input INT)
RETURNS BINARY(4) DETERMINISTIC NO SQL RETURN
    convert_unsigned_int_binary(CONVERT(input, UNSIGNED));

SET @int_value=123456;
SET @result=convert_int_binary(@int_value);
SET @trimmed_result=TRIM(LEADING '\0' FROM @result);

SELECT LENGTH(@result), LENGTH(@trimmed_result), @trimmed_result;

Screenshot of results

© www.soinside.com 2019 - 2024. All rights reserved.