我正在执行哈希操作,我需要一致,准确,高效地添加原始字节等。我无法处理ASCII编码的数字字符串,只需要获取原始字节即可。
MySQL的转换功能非常令人困惑,并且不会产生像我这样的SQL Server家伙似乎显而易见的结果。
例如,BINARY 123456
产生一个包含6个字符的ASCII编码字符串,而不是看似明显的BINARY ( 3 )
字符串00000001 11100010 01000000
或0x01E240
到目前为止,获得正确转换的唯一方法是分配一个十六进制文字,这在运行时显然是不切实际的。
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 ) ) ;
因此,在此示例中,如何将整数值(例如DECLARE
的整数变量或整数列)123456
转换为3个字节的字符串?
编辑:根据注释中的要求,SQL-Server默认情况下会产生所需的结果:
这是我需要在MySQL中模仿的行为。
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;