CREATE TABLE ip_demo (
ip INT UNSIGNED NOT NULL,
name CHAR(1),
PRIMARY KEY (ip)
) ENGINE=InnoDB;
INSERT INTO ip_demo VALUES
(INET_ATON('192.168.1.200'), 'A'),
(INET_ATON('200.100.30.241'), 'B'),
(INET_ATON('24.89.35.27'), 'C'),
(INET_ATON('100.200.30.22'), 'D');
-- 整數儲存視圖
SELECT * FROM ip_demo;
+------------+------+
| ip | name |
+------------+------+
| 3232235976 | A |
| 3362004721 | B |
| 408494875 | C |
| 1690836502 | D |
+------------+------+
-- 還原顯示
SELECT INET_NTOA(ip), name FROM ip_demo;
+-----------------+------+
| INET_NTOA(ip) | name |
+-----------------+------+
| 192.168.1.200 | A |
| 200.100.30.241 | B |
| 24.89.35.27 | C |
| 100.200.30.22 | D |
+-----------------+------+
SELECT * FROM ip_demo WHERE ip = INET_ATON('192.168.1.200');
SELECT INET_NTOA(ip) FROM ip_demo
WHERE ip BETWEEN INET_ATON('192.168.1.0') AND INET_ATON('192.168.1.255');
-- 等價於
SELECT INET_NTOA(ip) FROM ip_demo
WHERE ip BETWEEN 3232235776 AND 3232236031;
-- PHP 範例
$ip_long = ip2long('192.168.1.200'); // 3232235976
$sql = "SELECT * FROM ip_demo WHERE ip = $ip_long";
| 方案 | 資料大小 | 索引大小 | 精確查詢 QPS | 範圍查詢 QPS |
|---|---|---|---|---|
| CHAR(15) | ~24 MB | ~30 MB | ~12,000 | ~800 |
| INT UNSIGNED | ~4 MB | ~8 MB | ~45,000 | ~15,000 |
ALTER TABLE ip_demo ADD COLUMN ip_int INT UNSIGNED;
UPDATE ip_demo SET ip_int = INET_ATON(ip_str);
-- 驗證無誤後
ALTER TABLE ip_demo DROP COLUMN ip_str, CHANGE COLUMN ip_int ip INT UNSIGNED NOT NULL;
ALTER TABLE ip_demo ADD PRIMARY KEY (ip);
INET6_ATON() / INET6_NTOA(),返回 VARBINARY(16)。VARBINARY(16) + 函數索引 (8.0+) 或應用層處理。**INT UNSIGNED + INET_ATON/NTOA** 是 IPv4 儲存的黃金標準:4 字節定長、索引極小、整數比較極快、原生支援範圍查詢。遷移成本低、收益即時,所有新專案請直接採用。