首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

IP 位址與整數互轉:PHP、ASP、MSSQL、MySQL 完整實作

     編輯:PHP 相關知識

轉換原理

IPv4 位址由四段組成:w.x.y.z,轉換為無號長整數的公式:

intIP = (w × 256³) + (x × 256²) + (y × 256) + z

亦即:w << 24 | x << 16 | y << 8 | z

PHP 內建函數(最簡單)

<?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'));
?>

ASP 自訂函數

' 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

MSSQL 自訂函數

-- 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

MySQL 內建函數

-- 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 極度高效
  • 跨語言一致性:各語言實作邏輯一致,資料互通無障礙

注意事項

  • IPv6 位址長度 128 位,需用 VARBINARY(16) 或兩個 BIGINT 儲存
  • PHP ip2long 在 32 位系統可能回傳負數,建議用 sprintf('%u', ...) 處理
  • MySQL INET_ATON/NTOA 僅支援 IPv4,IPv6 需用 INET6_ATON/NTOA(MySQL 5.6+)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved