Когда в логе или таблице ползут IP-шники всех мастей — рано или поздно понадобится понять, кто там сидит на IPv6. В PostgreSQL это делается одной строчкой, если у тебя всё нормально с типами данных.
📌 Почему это вообще важно
IPv6 — не модный фетиш, а реальность. У провайдеров заканчиваются IPv4, поэтому в логах можно встретить такие цепочки, что глазами не разберёшь. Если твой столбец «ip» хранит всё как varchar, то добро пожаловать в ад регулярных выражений. Но можно сразу сделать нормально.
✅ Правильный тип — inet
В PostgreSQL есть встроенный тип inet. Если твои IP-шники лежат в inet — считай, ты уже выиграл. С ним можно делать магию уровня family():
SELECT * FROM visits WHERE family(ip) = 6;
Всё. family() вернёт 4 или 6 — в зависимости от того, что лежит внутри. Фильтруешь по 6 — получаешь только IPv6.
⚡ Если у тебя ещё varchar
Если ты всё ещё хранишь IP-шники как строки — ну что ж. Придётся мигрировать. Без этого family() не прокатит:
ALTER TABLE visits ALTER COLUMN ip TYPE inet USING ip::inet;
Обрати внимание на USING ip::inet — без него PostgreSQL просто не догадается, как преобразовать твои строки. Если там мусор — миграция упадёт. Проверь заранее.
🗂 Итого
- Есть
inet? — Используйfamily(). - Всё ещё
varchar? — Исправь. - Надо быстро выцепить IPv6? —
WHERE family(ip) = 6.
Всё просто. Чистый лог — чистая совесть.
0 комментариев