Когда в логе или таблице ползут 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.

Всё просто. Чистый лог — чистая совесть.