Какова должна быть длина этого ключа MySQL tinyblob?

Для таблицы, которую я создаю, которая включает диапазоны 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», которые я предоставляю уникальной длине ключа, представляющей байты.

Что здесь происходит, и как я могу это исправить?


person Matt Huggins    schedule 16.07.2011    source источник
comment
См. также: stackoverflow.com/questions/4444771/   -  person Mchl    schedule 17.07.2011


Ответы (1)


Нет. Нет TINYBLOB. Используйте ВАРБИНАРИ. Даже в этом случае каждая цифра будет храниться как один байт, поэтому ваш ключ должен иметь длину 39 байт.

В качестве альтернативы вы можете использовать DECIMAL(39)

Или дождитесь выхода MySQL 5.6 с собственной поддержкой IPv6; P

person Mchl    schedule 16.07.2011