Предполагая, что вы подписали целые числа в своих столбцах, вам может потребоваться использовать CAST (a ^ b AS SIGNED), так как результатом оператора ^ является неподписанное 64-битное целое число в MySQL.
В случае, если это кому-то поможет, вот метод, который я использовал для обмена одним и тем же столбцом между двумя заданными строками:
SELECT BIT_XOR(foo) FROM table WHERE key = $1 OR key = $2
UPDATE table SET foo = CAST(foo ^ $3 AS SIGNED) WHERE key = $1 OR key = $2
, где $ 1 и $ 2 являются ключами двух строк, а $ 3 - результатом первого запроса .