我在mysql表中有一个称为“调色板”的字段。它的作用类似于rgb十六进制代码,但是我有12种颜色,而不是3种颜色,因此如果不将2个字符计为“ 0x”,则此二进制字段的长度为24。问题是我似乎无法对它们执行按位操作,就好像程序认为它们太大一样。

我想围绕这些内容做一些事情(我将其缩小以使其更易于理解):在mysql中为0x123456&0x00FF00并得到0x003400。但这似乎根本不起作用,因为这不是我获得的价值。

我希望得到一个精确的值,但是大多数时候我会得到0(即使有明显的值)或相反的0(当十六进制仅由“ F”填充时)。

最佳答案

如果唯一的问题是您不能使用较长的十六进制字符串,则可以为此实现SP。

DELIMITER $$

CREATE FUNCTION `bfunc`(
    `op` VARCHAR(3),
    `v1` VARCHAR(26) CHARSET latin1,
    `v2` VARCHAR(26) CHARSET latin1
)
RETURNS varchar(26) CHARSET latin1
DETERMINISTIC
BEGIN
    SET @r = '';
    SET @r1 = REVERSE(TRIM(LEADING '0x' FROM v1));
    SET @l1 = LENGTH(@r1);

    SET @r2 = REVERSE(TRIM(LEADING '0x' FROM v2));
    SET @l2 = LENGTH(@r2);

    SET @l = IF(@l1 > @l2, @l1, @l2);
    SET @i = 1;
    WHILE @i < @l DO
        SET @c1 = SUBSTR(@r1, @i, 1);
        SET @c2 = SUBSTR(@r2, @i, 1);
        SET @b1 = CONV(IF(@c1 = '', 0, @c1), 16, 10);
        SET @b2 = CONV(IF(@c2 = '', 0, @c2), 16, 10);
        SET @b = '';
        CASE op
            WHEN 'AND' THEN SET @b = @b1 & @b2;
            WHEN 'OR'  THEN SET @b = @b1 | @b2;
            WHEN 'XOR' THEN SET @b = @b1 ^ @b2;
        END CASE;

        SET @r = CONCAT(@r, HEX(@b));

        SET @i = @i + 1;
    END WHILE;

    RETURN REVERSE(@r);
END
$$

DELIMITER ;


SELECT bfunc('AND', '0x123456000000000000000000', '0x00FF00000000000000000000')


=>
03400000000000000000000

当然,对于生产环境,您需要对其进行优化,而不是按“每个字符”进行按位数学运算,例如,按“每8个字符”进行按位数学运算

关于mysql - 如何对巨大的二进制列进行按位运算,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55929315/

10-17 01:32