2011-07-16 20 views
0

對於我創建的包含IP範圍的表​​,我需要在MySQL記錄中存儲兩個128位(16字節)的int值。由於MySQL只支持高達8字節的整數,我發現我需要使用二進制列(tinyblob),這一切都很好。這個MySQL tinyblob密鑰的長度是多少?

CREATE TABLE `ip_ranges` (
    `ip_start` tinyblob NOT NULL, 
    `ip_end` tinyblob NOT NULL, 
    ... 
    UNIQUE KEY `index_ip_ranges_on_ip_start_and_ip_end` (`ip_start`(16),`ip_end`(16)) 
); 

我在這兩列上遇到了我唯一索引的問題。據我所知,IPv6的整數表示是128位(16字節)。因此,我將唯一密鑰中ip_startip_end列的唯一索引設置爲16個字節。不幸的是,我最終得到重複鍵錯誤與真正的IPv6數據填充時:

> INSERT INTO `ip_ranges` (`ip_end`, `ip_start`, ...) VALUES ("42540649945883696925221210589465935872", "42540649945883696943667954663175487487", ...); 
    Duplicate entry '42540649945883696925221210589465935872-4254064994588369694366795' for key 'index_ip_ranges_on_ip_start_and_ip_end' 

的「重複項」行顯示的鍵值以上使它看起來像被砍掉的ip_end價值的一部分。它缺少最後13位數字:「4663175487487」。這讓我認爲我錯誤地提供了代表字節的唯一密鑰長度的「16」。

這是怎麼回事,我該如何解決?

+0

參見:http://stackoverflow.com/questions/4444771/how-to-store -a-128比特數在-A-單柱合的MySQL – Mchl

回答

1

編號否TINYBLOB。使用VARBINARY。 即使這樣,每個數字將被存儲爲一個字節,所以您的密鑰將需要39B長。

另外,您可以使用十進制(39)

或者等到的MySQL 5.6原生支持IPv6,P

相關問題