В строках varchar(39), чтобы можно было туда записывать
IPv6 и чтобы не переусложнять дальнейшую работу с ними. Должно хватать этого размера, если планируется вписывать туда только сам IP или только глобальные адреса (16 байт, представленные 32-мя символами с семью разделительными двоеточиями; двойное двоеточие используется в качестве сокращения, т.е. для него резерв не требуется).
Бывают просто еще адреса с индексом зоны, которая добавляется в конце через процент. Насколько я понимаю, это используется только в локальных сетях, но не уверен. Поискал
в некоторых местах. Пишут, что размер зоны не регламентируется, так что в разном софте делают по-разному — 45-48 символов. Главное — учитывать, что исключительно редко адрес может всё же быть длиннее выбранного размера, и при записи отрезать его справа.
Почему я предлагаю именно такой способ.
Часть пользователей может иметь IPv4, а часть — IPv6. Если вы попытаетесь хранить их в бинарной форме (4 и 16 байт), то вам придётся держать две колонки в базе, искать при случае по ним раздельно. Также, в языках-фреймворках, через которые вы получаете IP-адрес пользователя, вероятно уже выдают его в виде строки. Так что, не придётся преобразовывать.
Справедливости ради, стоит сказать, что в текстовом представлении IPv6 вроде бы можно сократить по-разному, что усложнит поиск, группировку по хостам. Кроме того, доля IPv6, особенно в России,
небольшая и приходится, скорее всего, на мобильные устройства.