Какой тип данных выбрать для хранения IP-адреса в SQL Server?
Будет ли тогда достаточно легко выполнить фильтрацию по IP-адресу, выбрав правильный тип данных?
Какой тип данных выбрать для хранения IP-адреса в SQL Server?
Будет ли тогда достаточно легко выполнить фильтрацию по IP-адресу, выбрав правильный тип данных?
Ответы:
Технически правильный способ хранения IPv4 - двоичный (4), поскольку это то, чем он является на самом деле (нет, даже не INT32 / INT (4), числовая текстовая форма, которую мы все знаем и любим (255.255.255.255), просто преобразование отображения его двоичного содержимого).
Если вы сделаете это таким образом, вы захотите, чтобы функции конвертировали в текстовый формат отображения и обратно:
Вот как преобразовать текстовую форму отображения в двоичную:
А вот как преобразовать двоичный файл обратно в текстовую форму отображения:
Вот демонстрация того, как их использовать:
Наконец, при поиске и сравнении всегда используйте двоичную форму, если вы хотите использовать свои индексы.
ОБНОВИТЬ:
Я хотел добавить, что один из способов решить проблемы производительности, присущие скалярным UDF в SQL Server, но при этом сохранить повторное использование кода функции, - это использовать вместо этого iTVF (встроенную функцию с табличным значением). Вот как первая функция выше (строка в двоичный код) может быть переписана как iTVF:
Вот это в примере:
И вот как вы могли бы использовать его в INSERT
источник
Вы можете использовать varchar. Длина IPv4 статична, но длина IPv6 может сильно варьироваться.
Если у вас нет веских причин хранить его как двоичный, придерживайтесь строкового (текстового) типа.
источник
Вот код для преобразования IPV4 или IPv6 в формате varchar в двоичный (16) и обратно. Это самая маленькая форма, которую я мог придумать. Он должен хорошо индексироваться и обеспечивать относительно простой способ фильтрации по подсетям. Требуется SQL Server 2005 или новее. Не уверен, что он полностью пуленепробиваемый. Надеюсь это поможет.
источник
fn_ConvertIpAddressToBinary
. См. Ответ К.Плока и мой .Поскольку я хочу обрабатывать оба
IPv4
иIPv6
, я используюVARBINARY(16)
следующиеSQL CLR
функции для преобразования представленияtext
IP-адреса в байты и наоборот:источник
Люди, использующие .NET, могут использовать класс IPAddress для анализа строки IPv4 / IPv6 и сохранения ее в виде файла
VARBINARY(16)
. Можно использовать тот же класс для преобразованияbyte[]
в строку. Если вы хотите преобразоватьVARBINARY
в SQL:источник
sys.dm_exec_connections
использует varchar (48) после SQL Server 2005 SP1. Звучит достаточно хорошо для меня, особенно если вы хотите использовать его по сравнению с вашей ценностью.На самом деле, вы еще некоторое время не увидите IPv6 как мейнстрим, поэтому я бы предпочел маршрут 4 tinyint. Сказав это, я использую varchar (48), потому что мне нужно использовать
sys.dm_exec_connections
...В противном случае. В ответе Марка Редмана упоминается предыдущий вопрос
обсужденияSO .источник
Спасибо, RBarry. Я собираю систему распределения IP-блоков и сохраняю их в двоичном формате - это единственный выход.
Я сохраняю представление CIDR (например: 192.168.1.0/24) блока IP в поле varchar и использую 2 вычисляемых поля для хранения двоичной формы начала и конца блока. Оттуда я могу запускать быстрые запросы, чтобы узнать, выделен ли данный блок уже или его можно назначить.
Я изменил вашу функцию, чтобы вычислить конечный IP-адрес следующим образом:
источник
Я обычно использую простую фильтрацию VARCHAR для IPAddress, отлично работает.
Если вы хотите фильтровать диапазоны IP-адресов, я бы разбил их на четыре целых числа.
источник
Мне нравятся функции SandRock. Но я обнаружил ошибку в коде dbo.fn_ConvertIpAddressToBinary . Входящий параметр @ipAddress VARCHAR (39) слишком мал, когда вы присоединяете к нему @delim.
Вы можете увеличить его до 40. Или еще лучше использовать новую переменную большего размера и использовать ее для внутренних целей. Так вы не потеряете последнюю пару на больших числах.
источник
Следующий ответ основан на ответах М. Турнхаута и Джерри Бирчлера на этот вопрос, но со следующими улучшениями:
sys.fn_varbintohexsubstring
,fn_varbintohexstr
)CONVERT()
на бинарные стилиCAST('' as xml).value('xs:hexBinary())
)CONVERT()
на бинарные стили.fn_ConvertIpAddressToBinary
(как отметил C.Plock )Код был протестирован в SQL Server 2014 и SQL Server 2016 (см. Тестовые примеры в конце).
IPAddressVarbinaryToString
Преобразует 4- байтовые значения в IPV4 и 16-байтовые значения в строковые представления IPV6 . Обратите внимание, что эта функция не сокращает адреса.
Тестовые примеры:
IPAddressStringToVarbinary
Преобразует строковые представления IPV4 и IPV6 в двоичные значения размером 4 и 16 байтов соответственно. Обратите внимание, что эта функция может анализировать большинство (все обычно используемые) сокращенных представлений адресов (например, 127 ... 1 и 2001: db8 :: 1319: 370: 7348). Чтобы заставить функцию thins всегда возвращать 16-байтовые двоичные значения, раскомментируйте конкатенацию ведущих нулей в конце функции.
Тестовые кейсы
Действительные случаи
Недействительные случаи
источник
я использую
varchar(15)
пока все у меня работает. Вставить, обновить, выбрать. Я только что запустил приложение с IP-адресами, хотя еще не проделал большой работы по разработке.Вот инструкция select:
источник