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_start
和ip_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」。
這是怎麼回事,我該如何解決?
參見:http://stackoverflow.com/questions/4444771/how-to-store -a-128比特數在-A-單柱合的MySQL – Mchl