INET_ATON in MSSQL. Convert IP To int.

Programming
Предыдущий Следующий

Преобразовует IP адрес в big int. Для чего нужно преобразовывать IP в число int? Чтобы он (IP адрес) занимал меньше места. IP в виде строки: "222.222.222.222" - 15 байт. В виде числа - 4 байта. Такую запись часто использую в базе "IP адрес"->"Страна"->"Город".

В MySQL есть функция INET_ATON. А вот в MSSQL ее нету. Но ее легко реализовать:

CREATE FUNCTION [dbo].[IPToBINT] (@ip varchar(max))
    RETURNS bigint
    WITH SCHEMABINDING
AS
BEGIN
    DECLARE @idx1 int
    DECLARE @idx2 int
    DECLARE @idx3 int
    DECLARE @idx4 int
    DECLARE @ret bigint
     
    SELECT @idx1 = CHARINDEX('.', @ip)
    SELECT @idx2 = CHARINDEX('.', @ip, @idx1+1);
    SELECT @idx3 = CHARINDEX('.', @ip, @idx2+1);
     
    SELECT @ret = CONVERT(bigint, SUBSTRING(@ip, 0, @idx1)) * POWER(2, 24) +
                    CONVERT(bigint, SUBSTRING(@ip, @idx1 + 1, @idx2 - @idx1 - 1)) * POWER(2, 16) +
                    CONVERT(bigint, SUBSTRING(@ip, @idx2 + 1, @idx3 - @idx2 - 1)) * POWER(2, 8) +
                    CONVERT(bigint, SUBSTRING(@ip, @idx3 + 1, LEN(@ip) - @idx3))
    RETURN @ret
END
GO
 
CREATE FUNCTION [dbo].[BINTToIP] (@ip bigint)
    RETURNS varchar(16)
BEGIN
    DECLARE @ret varchar(16)
SELECT
    @ret =  CONVERT(varchar, @ip / POWER(2, 24)) + '.' +
                CONVERT(varchar, @ip  / POWER(2, 16) & 0xFF) + '.' +
                CONVERT(varchar, @ip / POWER(2, 8) & 0xFF) + '.' +
                CONVERT(varchar, @ip & 0xFF)
    RETURN @ret
END
GO

Пример использования  INSERT mytable VALUES(dbo.IPToBINT('1.2.3.4'))

Самостоятельный отпуск Опыт заказа вывоза мусора в Киеве Магія зміни: Від ночі до дня
Магія Вечірнього Неба: Відлякуйте втомленість дня і зануртеся у світ загадок і краси