2009-12-17 3 views
2

MySQL에 매우 큰 테이블이 있습니다. MD5를 문자열로 포함하는 CHAR (32) 필드를 사용하고 있습니다. MySQL을 사용하여 10 진수 값으로 변환해야하는 문제가 있습니다. 타사 도구가 쿼리를 실행하므로 이렇게 코드를 작성하는 것은 실제로 옵션이 아닙니다.저장된 md5 문자열을 MySQL의 십진수 값으로 변환합니다.

MySQL은 16 진수 값을 기본적으로 저장하고 정수로 변환하는 것을 지원합니다. 그러나 그것은 문자열에서 그것을 끊어 버리게됩니다. 여기에 내가 지금까지 시도한 것이있다. (md5_key는 내 칼럼의 이름이다.)

처음에는 UNHEX 함수를 시도했지만 문자열이 반환되어 gooblygoop을 주었다. 나는 여기에 두지 않을 것이다. "잘린 잘못된 정수 값을 : '0x000002dcc38af6f209e91518db3e79d3'"

을하지만 내가 할 경우 :

SELECT CAST(0x000002dcc38af6f209e91518db3e79d3 AS UNSIGNED); 

내가 얻을 다음으로 나에게주는 CAST 기능을

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

결과 = 0 경고보기를 시도 올바른 십진수 값.

그래서 내가 알아야 할 것은 MySQL이 해당 문자열을 16 진수 값으로 볼 수있는 방법일까요? (나는 또한 그것을 이진 (BINARY)으로 변환 한 다음 UNSIGNED (UNSIGNED)로 변환하려고했지만 그 중 하나도 작동하지 않았다.)

미리 감사드립니다.

답변

5

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 

경우 18,446,744,073,709,551,616 = 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; 
+0

고마워요! 이것은 효과가있는 것처럼 보입니다! – Cfreak

1

주의 MD5는 길이가 16 바이트이며 BIGINT UNSIGNED는 길이가 8 바이트이므로 두 번째 경우에도 올바른 대답을 얻지 못해도 숫자가 맞지 않아서 가장 낮은 8 바이트 => 09e91518db3e79d3.

관련 문제