2015-06-11 3 views
0

Я использую простой способ получить реальный ip. Я нашел его здесь: How to get Real IP from Visitor?Хранить IP-адрес в базе данных mysql

IP будет сохранен в базе данных, в некоторой ширине столбца VARCHAR 15. Я использую Varchar длиной 15, потому что я понимаю, что IP-адрес может быть 123.456.789.123, который имеет 12 номеров и 3 точки.

Теперь ... Я видел, что IPv6 имеет больше символов. Я не понимаю. У всех пользователей есть определенный IPv4 или могут быть некоторые пользователи с IPv6, а не IPv4?

Мне нужно понять, потому что я хочу оптимизировать этот столбец IP, как я увидел здесь: insert ip into mysql лучше сделать его десятичным.

Как сделать этот столбец десятичным, если ip (версия 6) может содержать более 15 символов?

Я запутывать ...

ответ

3

Для обработки и хранения как IPv4, так и IPv6-адреса, вы можете использовать тип данных VARBINARY(16).

В версии 5.6 MySQL (наконец!) Представил функции преобразования для адресов IPv6: INET6_ATON, поэтому вам не нужно выполнять преобразование в приложении.

Если вы регулируете только IPv4-адрес, вы можете продолжать использовать функцию INET6_ATON и BINARY(4) является подходящим типом данных для хранения его.

Удобно, что обратные функции для преобразования из двоичного представления обратно в точечную десятичную форму (для IPv4-адресов) или в шестнадцатеричную форму двоеточия (для адресов IPv6) также доступны.

Ссылка: https://dev.mysql.com/doc/refman/5.6/en/miscellaneous-functions.html#function_inet6-aton

Q: Как я должен сделать этот столбец десятичный, если ф (версия 6) может иметь более 15 символов?

A: Не делайте столбец DECIMAL, сделать его VARBINARY(16), и конвертировать как IPv4 пунктир десятичное представление, и представление шестигранной двоеточие IPv6 в двоичный representatin для ее хранения.

+0

Вид побочного вопроса, есть ли простой способ конвертировать [VAR] BINARY (4) в целое число? Я не могу заставить работать CAST/CONVERT, и единственное, что я нашел, это * работа * - это kludge: 'CAST (CONV (HEX (binfield), 16,10) как UNSIGNED)' – Sammitch

+0

@Sammitch: Клюд - это способ сделать это; Я не знаю каких-либо других предоставленных MySQL функций, которые делают преобразование. Функция MySQL ** 'INET_ATON' ** возвращает целое число, поэтому (не тестировалось) вы могли бы использовать **' INET6_NTOA' ** для преобразования 'BINARY (4)' в десятичную строчную нотацию, а затем в целое число. .. ** 'INET_ATON (INET6_NTOA (UNHEX ('C0A80164')))' ** – spencer7593

Смежные вопросы