|
Programmer ASP.NET MVC C# |
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')) |