Задать вопрос
@AlikDex

Как хранить IP в базе?

Собственно такой вот вопрос.
  1. как строку
  2. как число(не актуально для ip_v6)
  3. varbinary(16) предварительно упаковав функцией inet_pton()

Если можно, прокомментируйте свой выбор.

П.С.
Насколько целесообразно резервировать место в бд под ip_v6?
  • Вопрос задан
  • 3833 просмотра
Подписаться Оценить Комментировать
Решения вопроса 1
MaxDukov
@MaxDukov
впишусь в проект как SRE/DevOps.
OK google
INET_NTOA()
INET6_NTOA()
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
@mletov
На не очень больших объемах, вероятно, без особой разницы, по крайней мере, я обычно храню строкой.

Но когда я заглядывал внутрь чужих достаточно серьезных проектов с большими объемами данных, там хранилось именно числом через INET_ATON, так что подозреваю, что именно этот вариант считается правилом хорошего тона. Например, из-за производительности.
Ответ написан
Комментировать
IP-адрес это число. Для IPv4 - это 4 байта. Для IPv6 - это 16 байт.
Если нужен только v4 - тогда можно взять INT. Если нужно и то и другое, то
а) советую хранить оба адреса независимо, на время перехода они обычно доступны одновременно (если какой-то останется неизвестным - ничего страшного, пометите как NULL)
б) хранить в виде строки смысла не вижу вообще, БД это место для хранения данных, а не для интерфейс для просмотра, и ориентироваться надо на хранение. Кто хочет красиво вывести - пусть строит нужный запрос с препобразованиями, выше уже привели отличные функции.
в) храните в binary(4) и binary(16) чтобы иметь унифицированный подход (мне так было удобнее, советую и вам)
г) только не надо varbinary - размер адреса постоянен, никакого var быть не может. Типы данных с фиксированным размером (даже binary) намного легче в хранении и обработке, чем с переменным. Не мучайте СУБД не по делу.
Ответ написан
Комментировать
@vilgeforce
Раздолбай и программист
У меня хранятся как числа, преобразование через функции INET_NTOA()/INET_ATON().
Ответ написан
@Zzzz9
Может я не отвечу на ваш вопрос, но ipv4 это 4 байта, разделенных точкой
ping 0x5f.0x64.0xb4.0xc8
Обмен пакетами с 95.100.180.200 по с 32 байтами данных:
Ответ от 95.100.180.200: число байт=32 время=64мс TTL=53


ipv6 значит 16 байт
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы