我在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个字符”