MySQL

2010-03-29 6 views
57

में आईपी पते को स्टोर करने का सबसे प्रभावी तरीका MySQL में आईपी पते को स्टोर और पुनर्प्राप्त करने का सबसे प्रभावी तरीका क्या है? अभी मैं कर रहा हूँ:MySQL

SELECT * FROM logins WHERE ip = '1.2.3.4' 

कहाँ आईपी एक VARCHAR(15) क्षेत्र है।

वहाँ यह करने के लिए एक बेहतर तरीका है?

+11

ठीक है, तो आपका प्रोग्राम टूटा हुआ है या आईपीवी 6 के साथ बिल्कुल काम नहीं करता है ... sigh। – Juliano

उत्तर

95

IPv4 addresses लिए, आप उन्हें एक int unsigned के रूप में संग्रहीत करने और INET_ATON() और INET_NTOA() कार्यों का उपयोग अपने संख्यात्मक मान से आईपी पते वापस जाने के लिए करने के लिए, और इसके विपरीत कर सकते हैं।

उदाहरण:

SELECT INET_ATON('127.0.0.1'); 

+------------------------+ 
| INET_ATON('127.0.0.1') | 
+------------------------+ 
|    2130706433 | 
+------------------------+ 
1 row in set (0.00 sec) 


SELECT INET_NTOA('2130706433'); 

+-------------------------+ 
| INET_NTOA('2130706433') | 
+-------------------------+ 
| 127.0.0.1    | 
+-------------------------+ 
1 row in set (0.02 sec) 
+4

आप 'INT' के रूप में स्टोर नहीं करेंगे लेकिन 'अनन्य हस्ताक्षर' करेंगे। मुझे जानबूझकर इनबिल्ट कार्यों का उपयोग पसंद है। +1 – pstanton

+0

धन्यवाद। क्या आप जानते हैं कि इसके लिए कोई अजगर कार्य है या नहीं? – ensnare

+0

@ सेंसर: हाँ, इसे जांचें: http://snipplr.com/view/14807/convert-ip-to-int-and-int-to-ip/। –

4

सबसे महत्वपूर्ण बात यह सुनिश्चित करना है कि कॉलम अनुक्रमित है। यह आईपी पते के आधार पर प्रश्नों में एक बड़ा अंतर डाल सकता है।

+0

मेरी समझ यह है कि एक वर्चर्स पर इंडेक्स सीमित सहायता के हैं। – flickerfly

1

शायद पूर्णांक फ़ील्ड में पूर्णांक मान को स्टोर कर सकता है? एक आईपी पता मूल रूप से 4 "शॉर्ट्स" है।

इसे देखें: http://en.kioskea.net/faq/945-converting-a-32-bit-integer-into-ip

+0

तो वह इसे चार क्षेत्रों में स्टोर करेगा? और वे बाइट्स होंगे, नहीं? 2^8 हर बार वैकल्पिक रूप से, वह उन्हें दशमलव संख्या में परिवर्तित कर सकता है और दशमलव स्टोर कर सकता है, हालांकि यह एक बड़ा क्षेत्र होगा, यह एक ही क्षेत्र होगा। – jcolebrand

+1

एक और उचित स्थानीय भाषा यह कहना होगा कि एक आईपी पता 4 बाइट्स है। –

+0

मुझे मिल गया। ब्रायन का कहना है कि अवधारणात्मक रूप से एक int चार शॉर्ट्स से बना है। एक छोटा बाइट है। एक int 4 बाइट्स है। जैसा कि इस पृष्ठ पर कहीं और कहा गया है, इसे एक हस्ताक्षरित int होना चाहिए। – joe

52

आप केवल IPv4 पतों संग्रहीत करना चाहते हैं, तो आप उन्हें एक 32-बिट पूर्णांक क्षेत्र में स्टोर कर सकते हैं।

यदि आप आईपीवी 6 का भी समर्थन करना चाहते हैं, तो शायद एक स्ट्रिंग शायद सबसे आसान-पढ़ने/उपयोग करने का तरीका है (हालांकि आप उन्हें तकनीकी रूप से 16-बाइट VARBINARY() फ़ील्ड में स्टोर कर सकते हैं, यह उत्पन्न करने की कोशिश करने में परेशान होगा आईपी ​​पते द्वारा "हाथ से" चुनने के लिए एसक्यूएल कथन)

+18

+1: एकमात्र उत्तर जो आईपीवी 6 – Juliano

+3

के उपयोग की भविष्यवाणी करता है बस उपयोग करते समय आईपीवी 6 फ़ंक्शन अलग हैं (INET6_ATON (आईपी))। आईपीवी 4 को वैबिनरी (4) और आईपीवी 6 की आवश्यकता है VARBINARY (16) (जो निश्चित रूप से वी 4 पते के लिए भी काम करता है)। आप एक वी 4 आईपी (आईएनटी) को इस तरह के संगत प्रारूप में परिवर्तित कर सकते हैं: INET6_ATON (INET_NTOA (ip)) – John

1

आपके साथ काम करने के लिए जो भी आसान है। आकार या गति समस्या तब तक कोई मुद्दा नहीं है जब तक आपको पता न हो कि यह प्रोफाइलिंग का मुद्दा है। कुछ मामलों में, यदि आपको आंशिक मिलान करने की आवश्यकता है तो एक स्ट्रिंग के साथ काम करना आसान हो सकता है। लेकिन एक स्थान या प्रदर्शन के मुद्दे के रूप में, इसके बारे में चिंता न करें जब तक कि आपके पास इसके बारे में चिंता करने का असली कारण न हो।