MySQL में IP पतों को सही ढंग से क्रमबद्ध करना: INET_ATON()
IP पते (IPv4) को स्ट्रिंग के रूप में क्रमबद्ध करने पर गलत क्रम मिलता है क्योंकि स्ट्रिंग तुलना वर्ण-दर-वर्ण काम करती है (उदाहरण: '192.168.110.100' '192.168.110.2' से पहले आता है)। INET_ATON() IP पते को संख्या में बदलता है, जिससे सही संख्यात्मक क्रमबद्धता सक्षम होती है।
टेबल बनाना
mysql> CREATE TABLE DemoTable (
-> IpAddress VARCHAR(50)
-> );
Query OK, 0 rows affected (1.36 sec)
डेटा डालना
mysql> INSERT INTO DemoTable VALUES ('192.168.110.78');
Query OK, 1 row affected (0.18 sec)
mysql> INSERT INTO DemoTable VALUES ('192.168.110.87');
Query OK, 1 row affected (0.27 sec)
mysql> INSERT INTO DemoTable VALUES ('192.168.110.75');
Query OK, 1 row affected (0.26 sec)
स्ट्रिंग क्रम (गलत)
mysql> SELECT * FROM DemoTable;
+----------------+
| IpAddress |
+----------------+
| 192.168.110.78 |
| 192.168.110.87 |
| 192.168.110.75 |
+----------------+
3 rows in set (0.00 sec)
mysql> SELECT * FROM DemoTable ORDER BY IpAddress;
+----------------+
| IpAddress |
+----------------+
| 192.168.110.75 |
| 192.168.110.78 |
| 192.168.110.87 |
+----------------+
3 rows in set (0.00 sec)
इस मामले में स्ट्रिंग क्रम संयोग से काम करता है क्योंकि अंतिम ऑक्टेट समान लंबाई के हैं। लेकिन '192.168.110.100' '192.168.110.2' से पहले आ जाएगा।
INET_ATON() के साथ सही संख्यात्मक क्रम
mysql> SELECT * FROM DemoTable
-> ORDER BY INET_ATON(IpAddress);
परिणाम
+----------------+
| IpAddress |
+----------------+
| 192.168.110.75 |
| 192.168.110.78 |
| 192.168.110.87 |
+----------------+
3 rows in set (0.00 sec)
INET_ATON() कैसे काम करता है
mysql> SELECT INET_ATON('192.168.110.75');
+------------------------------+
| INET_ATON('192.168.110.75') |
+------------------------------+
| 3232259659 |
+------------------------------+
mysql> SELECT INET_ATON('192.168.110.78');
+------------------------------+
| INET_ATON('192.168.110.78') |
+------------------------------+
| 3232259662 |
+------------------------------+
mysql> SELECT INET_ATON('192.168.110.87');
+------------------------------+
| INET_ATON('192.168.110.87') |
+------------------------------+
| 3232259671 |
+------------------------------+
गणना: (192×256³) + (168×256²) + (110×256¹) + (75×256⁰) = 3232259659
उलटा: INET_NTOA()
mysql> SELECT INET_NTOA(3232259659);
+-------------------------+
| INET_NTOA(3232259659) |
+-------------------------+
| 192.168.110.75 |
+-------------------------+
IPv6 के लिए (MySQL 5.6+)
-- IPv6 के लिए INET6_ATON/INET6_NTOA का उपयोग करें
SELECT INET6_ATON('2001:db8::1'); -- VARBINARY लौटाता है
SELECT INET6_NTOA(INET6_ATON('2001:db8::1'));
व्यावहारिक अनुप्रयोग: IP रेंज क्वेरी
-- 192.168.110.0/24 रेंज में IP खोजें
SELECT * FROM DemoTable
WHERE INET_ATON(IpAddress) BETWEEN INET_ATON('192.168.110.0') AND INET_ATON('192.168.110.255');
प्रदर्शन युक्ति
बड़े टेबल्स पर अक्सर IP द्वारा क्वेरी करने के लिए, एक उत्पन्न कॉलम और इंडेक्स जोड़ें:
ALTER TABLE DemoTable
ADD COLUMN ip_numeric INT AS (INET_ATON(IpAddress)) STORED,
ADD INDEX idx_ip_numeric (ip_numeric);
फिर क्वेरी करें: WHERE ip_numeric BETWEEN ...
संबंधित फ़ंक्शन
IS_IPV4(),IS_IPV6(): IP संस्करण मान्य करेंIP2LONG()(PHP): PHP में समान कार्यक्षमता