IP पता संग्रहीत करना


25

मुझे डेटाबेस में सभी पंजीकृत उपयोगकर्ताओं के आईपी पते को स्टोर करना है। मैं सोच रहा हूं, ऐसे कॉलम के लिए मुझे कितने वर्णों की घोषणा करनी चाहिए?

क्या मुझे IPv6 का भी समर्थन करना चाहिए? यदि हां, तो आईपी पते की अधिकतम लंबाई क्या है?

जवाबों:


27

एक स्ट्रिंग के रूप में संग्रहित न करें। एक int unsignedकॉलम का उपयोग करें INET_ATON()और INET_NTOA()क्रमशः / स्टोर करें और पुनः प्राप्त करें । AFAIK mysql ipv6 के लिए INET_ * का समर्थन नहीं करता है।

टिप्पणी के अनुसार संपादित करें

IP से कन्वर्ट करने के लिए फ़ंक्शन में निर्मित / पूर्णांक से (और इसलिए डेटाबेस में उन पूर्णांकों को संग्रहीत करने के लिए) का उपयोग स्वचालित रूप से उन आईपी को मान्य करने का दुष्प्रभाव है। मान लें कि आप एक IP को VARCHAR (16) के रूप में संग्रहीत करते हैं, आपको यह सुनिश्चित करना होगा कि कुछ कस्टम सत्यापन के साथ अमान्य IP (जैसे कि उदाहरण के रूप में 999.999.999.999) को संग्रहीत न करें। INET_ * फ़ंक्शंस का ध्यान रखते हैं।


1
-1, IP पते 128 बिट तक के हैं और MySQL द्वारा समर्थित सबसे बड़ा पूर्णांक प्रकार 64 बिट है।
हेंड्रिक ब्रम्मनमैन

3
IPv4 32-बिट है। 128-बिट IPv6 के लिए है, जो, जैसा कि उन्होंने उल्लेख किया है, INET_ * सामान समर्थन नहीं करता है।
रिचर्ड

1
IPv6 पते के लिए, INET6_ATON () और INET6_NTOA () फ़ंक्शन का उपयोग करें, उदाहरण देखें - rathishkumar.in/2017/08/how-to-store-ip-address-in-mysqb.html
rathishDBA

6

शायद आईपीवी 6 पर विचार शुरू करने का समय आ गया है। MySQL में IPv6 पतों को बाइनरी फॉर्मेट में बदलने के तरीके नहीं हैं। एक चालीस वर्ण स्ट्रिंग किसी भी सामान्य IPv6 पते को संभाल लेगी। एक प्रारूप है जो 40 अक्षरों से अधिक हो सकता है, मैं उन लोगों पर विचार करूंगा जो अभ्यास नहीं होने की संभावना है।

आप आकार की गणना तब से कर सकते हैं जिसमें जानकारी होगी कि 7 विभाजक वर्णों के साथ अधिकतम 8 चार वर्ण समूह होंगे। असामान्य प्रारूप IPv4 प्रारूप पते के साथ अंतिम दो समूहों को बदलता है। कोई पता नहीं संपीड़न के साथ यह अंतिम 9 वर्णों को 15 वर्णों के साथ बदलता है।

यदि आप ब्लॉक संग्रहीत कर रहे हैं, तो ब्लॉक आकार संकेत IPv4 के लिए आवश्यक 3 वर्णों के बजाय 4 वर्ण ले सकता है।

आपको यह सुनिश्चित करना चाहिए कि आपके द्वारा प्राप्त प्रारूप संगत है, लेकिन मैंने जो भी सॉफ़्टवेयर देखा है, वह पते के लिए सुसंगत प्रारूप देता है।


2
मैं पूरी तरह से सहमत हूं, IPv6 आ रहा है और इसके लिए तैयार होने से बेहतर है कि आप इसकी प्रतीक्षा करें जैसे Y2K: D
Jeff

न केवल आ रहा है, बल्कि पहले से ही मेरे सिस्टम पर।
BillThor

6

मैं PostgreSQL के लिए माइग्रेशन और INET या CIDR डेटा प्रकारों का उपयोग करने का सुझाव दूंगा

CREATE TABLE test ( test_id serial PRIMARY KEY, address inet );
INSERT INTO test ( address ) VALUES ( '1.2.3.4'::inet );
INSERT INTO test ( address ) VALUES ( 'a:b::c:d'::inet );
SELECT * FROM test;
 test_id | address  
---------+----------
       1 | 1.2.3.4
       2 | a:b::c:d

IP प्राप्त करने के लिए नेटवर्क में कौन-कौन से सेलेक्ट * FROM टेस्ट से पता कर रहे हैं << '1.2.3.0/24'::inet;
jkj

4

यहाँ MySQL मेलिंग सूचियों में से एक में सबसे अच्छा उत्तर दिया गया है। पढ़ें बेस्ट Fieldtype आईपी पते स्टोर करने के लिए ...

संक्षेप में यह सुझाव देता है, जो मैं INT (10) UNSIGNED का उपयोग करने के लिए दूसरा है।

  1. यह कम मेमोरी (केवल 4 बाइट्स) का उपयोग करता है
  2. आईपी ​​श्रेणियों को छाँटने और खोजने के लिए सबसे अच्छा है, खासकर यदि आप अपने आगंतुकों की उत्पत्ति के देश की तलाश करते हैं।

तो, 192.168.10.50 का उपयोग कर:

(192 * 2 ^ 24) + (168 * 2 ^ 16) + (10 * 2 ^ 8) + 50 = 3232238130 (192.168.10.50 में परिणाम)

MySQL में, आप सीधे SELECT INET_ATON('192.168.10.50'); प्राप्त करने के लिए उपयोग कर सकते हैं 3232238130

या

192 + (168 * 2 ^ 8) + (10 * 2 ^ 16) + (50 * 2 ^ 24) = 839559360 (पीछे की ओर, परिणाम 50.10.168.192 में)

MySQL में, आप वापस SELECT INET_NTOA(3232238130); पाने के लिए सीधे उपयोग कर सकते हैं 192.168.10.50


प्रभावशाली, आपके लिए +1 !!! 4 बाइट्स अहस्ताक्षरित का उपयोग करके सुनिश्चित करें कि किसी भी दिन स्ट्रिंग हेरफेर हो।
RolandoMySQLDBA

-1, IP पते 128 बिट तक के हैं और MySQL द्वारा समर्थित सबसे बड़ा पूर्णांक प्रकार 64 बिट है।
हेंड्रिक ब्रम्मनमैन

3
nhnb, IPv6 128 बिट है, लेकिन बातचीत आईपीवी 4 के बारे में जो है है 32 बिट। अपने ज्ञान पर जोर देते हुए प्रत्येक टिप्पणी / उत्तर पर टिप्पणी करने की आवश्यकता नहीं है।
आँख

आपके उत्तर में यह उल्लेख नहीं है कि यह केवल पुराने इंटरनेट प्रोटोकॉल से संबंधित है, जबकि प्रश्न में स्पष्ट रूप से IPv6 का उल्लेख है। यह देखते हुए कि अंतिम महापौर इंटरनेट प्रदाता (कम से कम मेरे देश में) इस वर्ष के अंत से पहले IPv6 का समर्थन करेगा, यह एक डेटाबेस संरचना को डिजाइन करने के लिए एक बहुत बुरा विचार है जो इसे संभाल नहीं सकता है।
हेंड्रिक ब्रम्मनमैन

2

MySQL v5.6.3 के रूप में उन्होंने इसके लिए समर्थन जोड़ा INET6_ATONऔर INET6_NOTAयह IPv4 और IPv6 पतों का ध्यान रखेगा। लेकिन वे अब इसे पूर्णांक के रूप में संग्रहीत नहीं करते हैं। IPv6 रिटर्न देता है varbinary(16)और IPv4 रिटर्न देता है varbinary(4)

http://dev.mysql.com/doc/refman/5.6/en/miscellaneous-functions.html#function_inet6-aton


1

आप अधिकतम 15 चक्रों को संग्रहीत कर सकते हैं। कृपया VARCHAR (15) का उपयोग न करें क्योंकि यह 16 बाइट्स है (पहली बाइट स्ट्रिंग की लंबाई का प्रबंधन करती है और इस प्रकार धीमी पुनर्प्राप्ति और भंडारण)। एक आईपी पते की तरह हमेशा CHAR (15) का उपयोग करें।


एक आईपी पते की अधिकतम लंबाई 45 अक्षर है।
हेंड्रिक ब्रम्मनमैन

क्या CHAR इसे रिक्त स्थान के साथ पैड नहीं करेगा?
गयुस

0

क्षमा करें, उत्तरों पर टिप्पणी नहीं कर सकता। स्टैकओवरफ्लो पर इसके बारे में एक सवाल है । और मैं पूरी तरह से चयनित जवाब से सहमत हूं: 2xBIGINT का उपयोग करना संभवतः आईपीवी 6 के लिए सबसे अच्छा तरीका है।

मेरा सुझाव है कि 2 * BIGINT के लिए जा रहे हैं, लेकिन सुनिश्चित करें कि वे UNSIGNED हैं। IPv6 में / 64 पता सीमा पर एक प्राकृतिक विभाजन का एक प्रकार है (क्योंकि / 64 एक छोटी नेटब्लॉक आकार है) जो उस के साथ अच्छी तरह से संरेखित करेगा।

इस बड़े निशान पर ipv4 स्टोर करना भी संभव है - या तो उनमें से किसी एक को NULL चिह्नित करके या V4COMPAT प्रारूप का उपयोग करके

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.