gpt4 book ai didi

mysql - 如何对巨大的二进制列进行按位运算

转载 作者:行者123 更新时间:2023-11-30 21:31:27 27 4
gpt4 key购买 nike

我在 mysql 表中有一个名为“palette”的字段。它就像一个 rgb 十六进制代码,但不是 3 种颜色,而是 12 种颜色。所以如果我不计算“0x”的 2 个字符,这个二进制字段的长度是 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com