जवाबों:
एक स्ट्रिंग के रूप में संग्रहित न करें। एक int unsigned
कॉलम का उपयोग करें INET_ATON()
और INET_NTOA()
क्रमशः / स्टोर करें और पुनः प्राप्त करें । AFAIK mysql ipv6 के लिए INET_ * का समर्थन नहीं करता है।
टिप्पणी के अनुसार संपादित करें
IP से कन्वर्ट करने के लिए फ़ंक्शन में निर्मित / पूर्णांक से (और इसलिए डेटाबेस में उन पूर्णांकों को संग्रहीत करने के लिए) का उपयोग स्वचालित रूप से उन आईपी को मान्य करने का दुष्प्रभाव है। मान लें कि आप एक IP को VARCHAR (16) के रूप में संग्रहीत करते हैं, आपको यह सुनिश्चित करना होगा कि कुछ कस्टम सत्यापन के साथ अमान्य IP (जैसे कि उदाहरण के रूप में 999.999.999.999) को संग्रहीत न करें। INET_ * फ़ंक्शंस का ध्यान रखते हैं।
शायद आईपीवी 6 पर विचार शुरू करने का समय आ गया है। MySQL में IPv6 पतों को बाइनरी फॉर्मेट में बदलने के तरीके नहीं हैं। एक चालीस वर्ण स्ट्रिंग किसी भी सामान्य IPv6 पते को संभाल लेगी। एक प्रारूप है जो 40 अक्षरों से अधिक हो सकता है, मैं उन लोगों पर विचार करूंगा जो अभ्यास नहीं होने की संभावना है।
आप आकार की गणना तब से कर सकते हैं जिसमें जानकारी होगी कि 7 विभाजक वर्णों के साथ अधिकतम 8 चार वर्ण समूह होंगे। असामान्य प्रारूप IPv4 प्रारूप पते के साथ अंतिम दो समूहों को बदलता है। कोई पता नहीं संपीड़न के साथ यह अंतिम 9 वर्णों को 15 वर्णों के साथ बदलता है।
यदि आप ब्लॉक संग्रहीत कर रहे हैं, तो ब्लॉक आकार संकेत IPv4 के लिए आवश्यक 3 वर्णों के बजाय 4 वर्ण ले सकता है।
आपको यह सुनिश्चित करना चाहिए कि आपके द्वारा प्राप्त प्रारूप संगत है, लेकिन मैंने जो भी सॉफ़्टवेयर देखा है, वह पते के लिए सुसंगत प्रारूप देता है।
मैं 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
यहाँ MySQL मेलिंग सूचियों में से एक में सबसे अच्छा उत्तर दिया गया है। पढ़ें बेस्ट Fieldtype आईपी पते स्टोर करने के लिए ... ।
संक्षेप में यह सुझाव देता है, जो मैं INT (10) UNSIGNED का उपयोग करने के लिए दूसरा है।
तो, 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
।
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
आप अधिकतम 15 चक्रों को संग्रहीत कर सकते हैं। कृपया VARCHAR (15) का उपयोग न करें क्योंकि यह 16 बाइट्स है (पहली बाइट स्ट्रिंग की लंबाई का प्रबंधन करती है और इस प्रकार धीमी पुनर्प्राप्ति और भंडारण)। एक आईपी पते की तरह हमेशा CHAR (15) का उपयोग करें।
क्षमा करें, उत्तरों पर टिप्पणी नहीं कर सकता। स्टैकओवरफ्लो पर इसके बारे में एक सवाल है । और मैं पूरी तरह से चयनित जवाब से सहमत हूं: 2xBIGINT का उपयोग करना संभवतः आईपीवी 6 के लिए सबसे अच्छा तरीका है।
मेरा सुझाव है कि 2 * BIGINT के लिए जा रहे हैं, लेकिन सुनिश्चित करें कि वे UNSIGNED हैं। IPv6 में / 64 पता सीमा पर एक प्राकृतिक विभाजन का एक प्रकार है (क्योंकि / 64 एक छोटी नेटब्लॉक आकार है) जो उस के साथ अच्छी तरह से संरेखित करेगा।
इस बड़े निशान पर ipv4 स्टोर करना भी संभव है - या तो उनमें से किसी एक को NULL चिह्नित करके या V4COMPAT प्रारूप का उपयोग करके