2009-12-17 55 views
2

我在MySQL中有一個非常大的表。我使用CHAR(32)字段,其中包含MD5作爲字符串當然。我遇到了一個問題,我需要使用MySQL將其轉換爲十進制值。第三方工具運行查詢,因此編寫代碼來完成此操作並不是真正的選擇。將存儲的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看到該字符串爲十六進制值? (我也嘗試將其轉換爲二進制,然後到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 

其中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; 
+0

謝謝!這似乎工作! – Cfreak 2009-12-18 15:36:22

1

當心MD5是16字節長,而BIGINT UNSIGNED是8字節長,所以即使在你的第二種情況下你沒有得到正確的答案,這個數字也不適合你接收最低8字節的值=> 09e91518db3e79d3。

相關問題