كيفية تخزين عنوان IPv6 المتوافق في قاعدة بيانات علائقية

StackOverflow https://stackoverflow.com/questions/420680

  •  05-07-2019
  •  | 
  •  

سؤال

كيف يمكنني فعل ذلك؟

في الوقت الحالي ، لن يتم استخدام IPv6 ، لكنني بحاجة إلى تصميم التطبيق لجعله جاهزًا لـ IPv6. من الضروري تخزين عناوين IP وكتل CIDR (أيضًا BGP NLRI ، ولكن هذه قصة أخرى) في قاعدة بيانات MySQL. لقد استخدمت INT لـ INT لـ IPv4 + tinyint لـ Masklen ، لكن IPv6 يبلغ 128 بت.

ما هو النهج سيكون الأفضل لذلك؟ 2xBIGINT? CHAR(16) للتخزين الثنائي؟ CHAR(39) لتخزين النص؟ 8xSMALLINT في طاولة مخصصة؟

ماذا تنصح؟

هل كانت مفيدة؟

المحلول

لست متأكدًا ما هو حقا إجابة لـ MySQL نظرًا لأنه لا يدعم تنسيقات عنوان IPv6 بعد أصليًا (على الرغم من ذلك "أثناء وجوده"WL#798: دعم MySQL IPv6"يشير إلى أنه سيكون في MySQL V6.0 ، الوثائق الحالية لا تدعم ذلك).

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

نصائح أخرى

لاحظ أن الحد الأقصى لطول عنوان IPv6 ، بما في ذلك معرف النطاق ، هو 46 بايت كما هو محدد بواسطة Inet6_Addrstrlen في رؤوس C القياسية. لاستخدام الإنترنت يجب أن تكون قادرًا على تجاهل معرف المنطقة (٪ 10 ، #eth0 ، إلخ) ، ولكن فقط كن على دراية عندما getaddrinfo يعود نتيجة أطول من المتوقع.

إذا كنت تميل نحو Char (16) ، فاستخدم بالتأكيد ثنائيًا (16) بدلاً من ذلك. لا يحتوي Binary (N) على مفهوم للمجموعة أو مجموعة الأحرف (أو بالأحرى ، فهو عبارة عن char (n) مع charset/ollation of 'binary'). الافتراضي لـ char في mySQL هو latin1_swedish_ci ، مما يعني أنه سيحاول فرز ومقارنات غير حساسة للحالة لقيم البايتات التي هي نقاط رمز صالحة في LATIN1 ، مما سيؤدي إلى جميع أنواع المشكلات غير المتوقعة.

خيار آخر هو استخدام العشري (39 ، 0) Zerofill غير موقعة ، وليس فعالًا تمامًا مثل اثنين من bigints (سوف يستخدم العشري 4 بايت لكل تسعة أرقام في الإصدارات الحالية من MySQL) ، ولكن سيسمح لك بالحفاظ على كل شيء في عمود واحد وطباعة في الخارج.

أود أن أذهب للتنسيق المطبوع 39 "القياسي" الكامل:-

"2001:0db8:85a3:0000:0000:8a2e:0370:7334"

40 مع المنهي الفارغ.

هذا هو التنسيق المستخدمة من قبل أدوات سطر الأوامر *NIX ، والتنسيق الذي يتم الإبلاغ عن عنوان IPv6 (؟) في.

هل عنوان IP سيستخدمه برنامج يكون ثنائيًا منطقيًا؟ أو هل ستكون أفضل حالًا في تخزين تمثيل نص؟ أيضًا ، مع IPv6 ، من غير المرجح أن تستخدم العنوان بشكل عام وأكثر عرضة لاستخدام أسماء المضيف. ما إذا كان هذا ذا صلة يعتمد على التطبيق ، جزئياً. شار (16) سيكون خيارًا سيئًا ؛ char هو لبيانات الأحرف ولن يحب التدفقات الكبيرة من بايت الصفر التي هي سائدة في عناوين IPv6. سيكون 2 X Bigint غير مريح-حقولان واحد حقًا (بالإضافة إلى ذلك ، القيمة المخزنة ذات القيمة الكبيرة أو الصغار؟). لقد استخدمت نوعًا ثنائيًا ثابتًا ، أو إذا لم يكن ذلك متاحًا ، فسيكون نوع النقطة.

أنا أعمل مع مشروع أطول بادئة مطابقة ، لذلك أقوم بفصل العنوان إلى 4 أعداد صحيحة لعناوين IPv4. أنه يعمل بشكل جيد. سأقوم بتمديد ذلك إلى عناوين IPv6.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top