IPv4 位址由四段組成:w.x.y.z,轉換為無號長整數的公式:
intIP = (w × 256³) + (x × 256²) + (y × 256) + z
亦即:w << 24 | x << 16 | y << 8 | z
<?php
// IP 轉整數
$ipLong = ip2long('192.168.1.1'); // 3232235777
// 整數轉 IP
$ipStr = long2ip(3232235777); // '192.168.1.1'
// 注意:ip2long 可能回傳負數(有號整數),建議配合 sprintf('%u', ...) 轉無號
$ipUnsigned = sprintf('%u', ip2long('192.168.1.1'));
?>
' IP 轉數字
Function IP2Num(ByVal strIP)
Dim nIP, nIndex, arrIP
arrIP = Split(strIP, ".", 4)
For nIndex = 0 To 3
If nIndex <> 3 Then
arrIP(nIndex) = arrIP(nIndex) * (256 ^ (3 - nIndex))
End If
nIP = nIP + arrIP(nIndex)
Next
IP2Num = nIP
End Function
' 數字轉 IP
Function Num2IP(ByVal nIP)
Dim strIP, nTemp, nIndex
For nIndex = 3 To 0 Step -1
nTemp = Int(nIP / (256 ^ nIndex))
strIP = strIP & nTemp & "."
nIP = nIP - (nTemp * (256 ^ nIndex))
Next
Num2IP = Left(strIP, Len(strIP) - 1)
End Function
-- IP 轉 BIGINT
CREATE FUNCTION [dbo].[ipToInt](@strIp VARCHAR(15))
RETURNS BIGINT
AS
BEGIN
DECLARE @nIp BIGINT = 0
SELECT @nIp = @nIp + LEFT(@strIp, CHARINDEX('.', @strIp + '.') - 1) * Id
FROM (
SELECT Id = CAST(1*256*256*256 AS BIGINT)
UNION ALL SELECT 1*256*256
UNION ALL SELECT 1*256
UNION ALL SELECT 1
) AS T
RETURN @nIp
END
-- BIGINT 轉 IP
CREATE FUNCTION [dbo].[intToIP](@nIp BIGINT)
RETURNS VARCHAR(15)
AS
BEGIN
DECLARE @strIp VARCHAR(15) = ''
SELECT @strIp = @strIp + '.' + CAST(@nIp / ID AS VARCHAR), @nIp = @nIp % ID
FROM (
SELECT ID = CAST(1*256*256*256 AS BIGINT)
UNION ALL SELECT 1*256*256
UNION ALL SELECT 1*256
UNION ALL SELECT 1
) AS T
RETURN STUFF(@strIp, 1, 1, '')
END
-- IP 轉整數
SELECT INET_ATON('192.168.1.1'); -- 回傳 3232235777
-- 整數轉 IP
SELECT INET_NTOA(3232235777); -- 回傳 '192.168.1.1'
BIGINT 8 位元組 vs VARCHAR(15) 15+ 位元組WHERE ip_int BETWEEN start_ip AND end_ip 極度高效VARBINARY(16) 或兩個 BIGINT 儲存ip2long 在 32 位系統可能回傳負數,建議用 sprintf('%u', ...) 處理INET_ATON/NTOA 僅支援 IPv4,IPv6 需用 INET6_ATON/NTOA(MySQL 5.6+)