تهجير Magento 2 من utf8 إلى utf8mb4

استخدم أحد العملاء رمزًا تعبيريًا (emoji) في اسمه. قامت قاعدة البيانات باقتطاع الاسم مباشرة بعد الرمز التعبيري. لم يظهر أي خطأ في سجلات النظام (logs).

المشكلة تكمن في utf8 الخاص بـ MySQL. إنه ليس UTF-8 حقيقيًا، بل هو محدود بثلاثة بايتات فقط.

تحتاج الرموز التعبيرية والعديد من الرموز الحديثة إلى أربعة بايتات. إذا كنت تستخدم utf8 القديم، فسيقوم MySQL باقتطاع بياناتك. يحدث هذا بصمت إذا لم يكن وضع SQL (SQL mode) صارمًا. ستفقد البيانات دون أن تدري.

الحل هو utf8mb4، فهو يدعم أربعة بايتات لكل حرف.

لا يمكنك ببساطة تشغيل أمر تحويل على متجر Magento كبير؛ فمن المرجح أن تواجه خطأً يشير إلى أن المفتاح (key) طويل جدًا.

يحدث هذا لأن MySQL يحسب حجم الفهرس (index) بناءً على الحد الأقصى للبايتات الممكنة. عمود VARCHAR(255) يستهلك 765 بايت في utf8، بينما يحتاج نفس العمود في utf8mb4 إلى 1020 بايت، مما يتجاوز الحد القديم البالغ 767 بايت.

كيفية إصلاح ذلك:

  • استخدم MySQL 8.0 أو MySQL 5.7 مع تفعيل innodb_large_prefix. سيؤدي ذلك إلى زيادة حدك إلى 3072 بايت.
  • إذا كنت تستخدم خادمًا قديمًا، فقم بتقليل أعمدة VARCHAR المفهرسة إلى 191 حرفًا. 191 حرفًا مضروبة في 4 بايتات تساوي 764 بايت، وهذا يتناسب مع الحد المسموح به.

تتطلب عملية التهجير الناجحة ثلاث خطوات:

  1. تحديث قاعدة البيانات والجداول. استخدم ALTER TABLE CONVERT TO CHARACTER SET utf8mb4. يقوم هذا الأمر بإعادة كتابة البيانات الموجودة.
  2. تحديث الإعدادات الافتراضية للخادم في ملف my.cnf. يضمن ذلك استخدام الإعدادات الصحيحة للجداول الجديدة.
  3. تحديث ترميز اتصال التطبيق (application connection charset). إذا ظل الاتصال على utf8، فستتعرض البيانات للتلف قبل وصولها إلى قاعدة البيانات.

احذر من هذه المخاطر:

  • قفل الجداول (Table locks). يقوم أمر CONVERT TO بإعادة كتابة الجدول بالكامل. ستتعرض الجداول الكبيرة للقفل. استخدم أدوات مثل pt-online-schema-change للحفاظ على متجرك متصلًا بالإنترنت.
  • عدم تطابق الترتيب (Collation mismatches). يجب أن تستخدم جميع الجداول المرتبطة (joined tables) نفس الترتيب. استخدم utf8mb4_unicode_ci في كامل المخطط (schema) الخاص بك.

إذا كنت لا تزال تستخدم utf8، فإن متجرك ليس آمنًا للتعامل مع Unicode. أنت فقط تنتظر ظهور الحرف الخاطئ الذي سيتسبب في تلف بياناتك.

المصدر: https://dev.to/iamrobindhiman/migrating-a-magento-2-store-from-utf8-to-utf8mb4-without-losing-data-khn