Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> MySQL

MySQL में INET_ATON का उपयोग करके IP पतों को मानव-पठनीय क्रम में ऑर्डर करें

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 में समान कार्यक्षमता
  1. - MySQL में स्ट्रिंग और संख्या वाले VARCHAR रिकॉर्ड को कैसे क्रमबद्ध करें?

    MySQL में अल्फान्यूमेरिक कोड (जैसे 100A, 101J) को संख्यात्मक भाग के अनुसार क्रमबद्ध करने के लिए ORDER BY column+0, column तकनीक का उपयोग करें। समस्या स्ट्रिंग क्रम: 100A, 100B, 101J, 101S, 103M (लेक्सिकोग्राफिक) वांछित क्रम: संख्यात्मक भाग पहले, फिर अक्षर उदाहरण mysql> CREATE TABLE DemoTable (S

  1. - MySQL में रिकॉर्ड डालते समय तारीख को फॉर्मेट कैसे करें

    समाधान INSERT स्टेटमेंट में DATE_FORMAT() फंक्शन का उपयोग करें। उदाहरण टेबल बनाएं: CREATE TABLE DemoTable2012 (ShippingDate VARCHAR(20)); फॉर्मेटेड तारीख डालें: INSERT INTO DemoTable2012 VALUES (DATE_FORMAT(2014-01-21, %d.%m.%Y)); परिणाम +--------------+ | ShippingDate | +--------------+ | 21.1

  1. - MySQL में केवल विशिष्ट रिकॉर्ड की सूची को ASC क्रम में प्रदर्शित करें

    समाधान ORDER BY CASE स्टेटमेंट का उपयोग करके कस्टम क्रम लागू करें। उदाहरण टेबल बनाएं: INSERT INTO DemoTable2039 VALUES (John Doe), (John Smith), (Chris Brown), (Adam Smith), (David Miller); कस्टम क्रम क्वेरी Smith वाले नामों को अंत में रखें, फिर वर्णानुक्रम क्रम: ORDER BY CASE WHEN Name LIKE %Sm