it-swarm.asia

تخزين عنوان IP

لا بد لي من تخزين عنوان IP لجميع المستخدمين المسجلين في قاعدة البيانات. أتساءل ، كم عدد الأحرف التي يجب أن أعلنها لمثل هذا العمود؟

هل يجب أن أدعم IPv6 أيضًا؟ إذا كان الأمر كذلك ، فما هو الحد الأقصى لطول عنوان IP؟

26
Cleankod

لا تخزن كسلسلة. استخدم العمود int unsigned وقم بالتخزين/الاسترجاع باستخدام INET_ATON() و INET_NTOA() على التوالي. لا يدعم AFAIK mysql INET_ * لـ ipv6.

تحرير حسب التعليق

إن استخدام الوظيفة المدمجة لتحويل عناوين IP إلى/من الأعداد الصحيحة (وبالتالي تخزين تلك الأعداد الصحيحة في قاعدة البيانات) له تأثير جانبي للتحقق من صحة عناوين IP تلقائيًا. لنفترض أنك قمت بتخزين IP كـ VARCHAR (16) ، يجب عليك التأكد من عدم تخزين عناوين IP غير صالحة (مثل 999.999.999.999 كمثال) مع بعض التحقق من الصحة المخصص. وظائف INET_ * تهتم بذلك.

27
Mr Shunz

أقترح الترحيل إلى 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
7
jkj

ربما حان الوقت لبدء النظر في IPv6. ليس لدى MySQL طرق لتحويل عناوين IPv6 إلى تنسيق ثنائي. ستتعامل سلسلة الأحرف الأربعين مع أي عناوين IPv6 عادية. هناك تنسيق يمكن أن يتجاوز 40 حرفًا ، وأنا أعتبر أن من غير المحتمل أن يحدث ذلك.

يمكنك حساب الحجم من ثم المعلومات التي ستكون هناك على الأكثر 8 مجموعات أحرف مكونة من 7 أحرف فاصلة. يحل التنسيق غير الطبيعي محل المجموعتين الأخيرتين بعنوان تنسيق IPv4. بدون ضغط العنوان ، يستبدل آخر 9 أحرف بما يصل إلى 15 حرفًا.

إذا كنت تقوم بتخزين الكتل ، يمكن أن يأخذ مؤشر حجم الكتلة 4 أحرف بدلاً من الأحرف الثلاثة المطلوبة لـ IPv4.

يجب عليك التأكد من أن التنسيق الذي تحصل عليه متناسق ، ولكن جميع البرامج التي رأيتها تعطي تنسيقات متناسقة للعناوين.

6
BillThor

فيما يلي أفضل إجابة تمت في إحدى قوائم بريد MySQL. قراءة أفضل نوع لتخزين عنوان IP ... .

يقترح بإيجاز ، وأنا الثاني ، لاستخدام INT (10) غير موقعة.

  1. يستخدم ذاكرة أقل (4 بايت فقط)
  2. الأفضل لفرز نطاقات IP والبحث عنها ، خاصة إذا كنت تبحث عن بلد منشأ زوارك.

لذلك ، باستخدام 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.

4
Eye

اعتبارًا من 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

2
Vizjerai

يمكنك تخزين ما يصل إلى 15 حرفًا. يرجى عدم استخدام VARCHAR (15) لأن ذلك هو 16 بايت (البايت الأول يدير طول السلسلة وبالتالي استرجاع وتخزين أبطأ). استخدم CHAR (15) دائمًا في شيء مثل عنوان IP.

1
RolandoMySQLDBA

عذرًا ، لا يمكن التعليق على الإجابات. هناك سؤال عن ذلك على stackoverflow. وأنا أتفق تمامًا مع الإجابة المحددة: استخدام 2xBIGINT هو على الأرجح أفضل طريقة لـ ipv6 حاليًا.

أقترح الذهاب إلى 2 * BIGINT ، ولكن تأكد من أنها غير موقعة. هناك نوع من الانقسام الطبيعي عند حدود العنوان/64 في IPv6 (نظرًا لأن/64 أصغر حجم netblock) والذي سيتماشى بشكل جيد مع ذلك.

من الممكن أيضًا تخزين ipv4 على هذا الدليل الكبير - إما عن طريق وضع علامة على أحدها NULL أو باستخدام تنسيق V4COMPAT

0
rvs