INET_ATON('a.b.c.d') → 無號整數 (網絡字節序:a×256³ + b×256² + c×256 + d)INET_NTOA(int) → 'a.b.c.d' 字串192.168.33.123
= 192×256³ + 168×256² + 33×256 + 123
= 192×16777216 + 168×65536 + 33×256 + 123
= 3221225472 + 11010048 + 8448 + 123
= 3232244091
驗證:SELECT INET_ATON('192.168.33.123'); -- 3232244091
SELECT INET_ATON('127.1'); -- 2130706433 (等同 127.0.0.1)
SELECT INET_ATON('127.0.0.1'); -- 2130706433
INT UNSIGNED** (4 字節),範圍 0~4294967295 覆蓋全 IPv4 空間。INT,>127.*.*.* 會溢出為負數或截斷。VARBINARY(16) + INET6_ATON/NTOA (MySQL 5.6+)。-- 手寫轉換 (不推薦)
CREATE FUNCTION transIPtoInt(ip CHAR(31)) RETURNS INT
BEGIN
DECLARE v1,v2,v3,v4 INT;
SET v1 = SUBSTRING_INDEX(ip, '.', 1) << 24;
SET v2 = SUBSTRING_INDEX(SUBSTRING_INDEX(ip, '.', 2), '.', -1) << 16;
SET v3 = SUBSTRING_INDEX(SUBSTRING_INDEX(ip, '.', -2), '.', 1) << 8;
SET v4 = SUBSTRING_INDEX(ip, '.', -1);
RETURN v1+v2+v3+v4;
END;
SELECT * FROM ip_table WHERE ip = INET_ATON('192.168.1.200');
SELECT INET_NTOA(ip) FROM ip_table
WHERE ip BETWEEN INET_ATON('192.168.1.0') AND INET_ATON('192.168.1.255');
SELECT INET_NTOA(ip) FROM ip_table WHERE INET_NTOA(ip) LIKE '192.168.1.%';
| 指標 | CHAR(15) 字串 | INT UNSIGNED |
|---|---|---|
| 儲存空間 | 16 字節 | 4 字節 |
| 索引大小 | 大 | 小 75% |
| 比較運算 | 字串逐字節 | 整數單指令 |
| 範圍查詢 | 需函數轉換 | 原生 BETWEEN |
SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(), '%Y %D %M %h:%i:%s %x');
-- 2024 3rd August 03:35:48 2024
**IPv4 儲存首選 INT UNSIGNED + INET_ATON/NTOA**:空間省 75%、索引小、比較快、範圍查詢原生支援。棄用字串儲存,拒絕自定義轉換函數。