Как заставить MySql считать текстовое значение столбца HEX числом?
Суть задачи: необходимо побитово сравнить два HEX значения, одно приходит из php, второе лежит в базе в текстовом виде. Проблема в том, что не удаётся вытащить второе значение ввиде HEX числа, только как строку. Первое число "вклеивается" в запрос на строне php примерно так "SELECT hash ^ 0x".$hash." FROM...." и с этим проблем нет.
Как заставить MySql считать текстовое значение столбца HEX числом?
Например, если составить запрос руками и вписать туда 2 hex SELECT 0xd9d8266fd990160f ^ 0xd9d8266fd990160e
То вернет, как положенно 1. (^ это побитовый оператор XOR)
Но если сравнить со значением из колонки, т.е. SELECT 0xd9d8266fd990160f ^ column from table
То возвращает ерунду, т.к. считает значение колонки не HEX, а string.
Странно, но у меня не работает. Вот запрос: SELECT CONV(hash, 16, 10) ^ 0xd9d8266fd990160f FROM `cat_images` WHERE hash = 'd9d8266fd990160f'
Строковое значение в столбце hash посимвольно совпадает с hex числом в select, то есть результатом XOR должен быть 0, но я получаю 11972777347531139568
@nilagor я об этом написал в первом комментарии - есть ограничение. В принципе, оба ваших числа 64-х битные и проблем быть не должно. Но на деле, где-то в дебрях MySQL происходит переполнение и она начинает выдавать неверный результат. А если сумма двух операндов меньше 0xFFFFFFFFFFFFFFFF, то все считается правильно. Почему так, пока не знаю...
@ssenkevich да точно, виноват. Виндовый калькулятор в режиме программиста обманул меня, молча упав с переполнением) сложил руками - результат действительно больше ограничения. Спасибо!
@ssenkevich на другом ресурсе подсказали полностью рабочее решение - обернуть CONV в CAST( AS UNSIGNED). В таком случае ограничение MySQL увеличивается и в данном конкретном случае этого хватает.
For a string argument str, HEX() returns a hexadecimal string representation of str where...
Т.е. HEX просто берет любую строку, и возвращает ее HEX представление, как СТРОКУ. А для наших строк, которые и так являются HEX, происходит вообще каша.
Ага, эта статья изучена до дыр. Перепробованы всевозможные варианты подстановок в запрос.
Т.е. варианты аля SELECT X'columnName';
Не работают. Mysql упорно пытается распарсить выражение X'columnName', как имя колонки и падает