Для создаваемой таблицы, которая включает в себя диапазоны IP-адресов, мне нужно хранить два 128-битных (16-байтовых) значения int в записи MySQL. Так как MySQL поддерживает только до 8-байтовых чисел, я обнаружил, что мне нужно использовать двоичный столбец (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", которое я предоставляю уникальной длине ключа, представляющей байты.
Что здесь происходит, и как я могу это исправить?