|
|
Programmer ASP.NET MVC C# |
Programming
|
||
| Previous | Next | |
|
Преобразовует 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 SCHEMABINDINGASBEGIN 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 @retENDGOCREATE 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 @retENDGOПример использования INSERT mytable VALUES(dbo.IPToBINT('1.2.3.4')) |
||