Преобразовать сохраненную строку md5 в десятичное значение в MySQL - PullRequest
2 голосов
/ 18 декабря 2009

У меня очень большая таблица в MySQL. Я использую поле CHAR (32), которое содержит MD5 в качестве строки, конечно. Я сталкиваюсь с проблемой, где мне нужно преобразовать это в десятичное значение, используя MySQL. Сторонний инструмент запускает запрос, поэтому написание кода для этого на самом деле не вариант.

MySQL поддерживает собственное хранение шестнадцатеричных значений и преобразование их в целые числа. Но он зависает, превращая его из строки. Вот что я пробовал до сих пор (md5_key - название моей колонки)

Сначала я только что попробовал функцию UNHEX, но она возвращает строку, поэтому она дала мне gooblygoop. Я не буду помещать это здесь. Затем я попробовал функцию CAST

SELECT CAST( CONCAT('0x',md5_key) AS UNSIGNED ) FROM bigtable limit 1

Результат = 0 Показывать предупреждения дает мне: «Усеченное неверное значение INTEGER: '0x000002dcc38af6f209e91518db3e79d3'"

НО, если я сделаю:

SELECT CAST( 0x000002dcc38af6f209e91518db3e79d3 AS UNSIGNED );

Я получил правильное десятичное значение.

Итак, я думаю, что мне нужно знать, есть ли способ заставить MySQL видеть эту строку как шестнадцатеричное значение? (Я также пытался преобразовать его в BINARY, а затем в UNSIGNED, но это тоже не сработало).

Заранее спасибо!

Ответы [ 2 ]

5 голосов
/ 18 декабря 2009

conv () ограничено 64-битными целыми числами. Вы можете преобразовать верхнюю и нижнюю части в десятичную, а затем сложить их вместе:

> select cast(conv(substr("000002dcc38af6f209e91518db3e79d3", 1, 16), 16, 10) as
              decimal(65))*18446744073709551616 +
         cast(conv(substr("000002dcc38af6f209e91518db3e79d3", 17, 16), 16, 10) as
              decimal(65));
58055532535286745202684464101843

Где 18446744073709551616 = 2 ^ 64. Итак, в вашем случае:

> select cast(conv(substr(md5_key, 1, 16), 16, 10) as 
              decimal(65))*18446744073709551616 +
         cast(conv(substr(md5_key, 17, 16), 16, 10) as
              decimal(65))
         from bigtable limit 1;
1 голос
/ 18 декабря 2009

Остерегайтесь MD5 длиной 16 байт, а BIGINT UNSIGNED - длиной 8 байт, поэтому даже во втором случае вы не получите правильный ответ, число не может соответствовать, вы получаете значение самого низкого 8 байт = > 09e91518db3e79d3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...