IPv6-адреса 128-битные (16 байт), поэтому вам нужно достаточно большое поле для его хранения.Также вам может понадобиться поле, чтобы указать, является ли IP-адрес IPv4 или IPv6 (:: 192.168.4.10 в IPv6 численно совпадает с 192.168.4.10 в IPv4, но в зависимости от вашего приложения вам может потребоваться различать два).
Если вам нужно сохранить подсети, вы можете сохранить первый адрес, маску CIDR и вычисленный верхний адрес (широковещательный адрес) подсети.Это поможет при поиске, поэтому вы можете выполнять такие запросы:
SELECT * FROM networks WHERE lowerBound<=MYIP AND upperBound>=MYIP
. Если вы используете подсети, вам также следует рассчитать эту нижнюю границу самостоятельно, а не просто полагаться на то, что пользователь делает это правильно (псевдокод):
lowerBound = AND(networkAddress, subnetMask)
upperBound = OR(lowerBound, complement(subnetMask))
Это относится как к IPv4, так и к IPv6.