Какой должна быть длина для этого ключа MySQL tinyblob? - PullRequest
0 голосов
/ 17 июля 2011

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

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

1 Ответ

1 голос
/ 17 июля 2011

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

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

или дождаться MySQL 5.6 с собственным IPv6.поддержка; P

...