هل تستخدم ترميز utf8 في قواعد البيانات الخاصة بك؟ في هذا الموضوع سوف أشرح لماذا يجب عليك التبديل إلى utf8mb4 بدلا من ذلك، وكيفية القيام بذلك.
UTF-8
يمكن أن يمثل
ترميز utf-8 كل رمز في مجموعة أحرف Unicode، والتي تتراوح من U + 000000 إلى U + 10FFFF. هذا هو 1،114،112 من الرموز الممكنة. (لم يتم تعيين كل رموز Unicode هذه حتى الآن، ولكن ذلك لا يمنع utf-8 من القدرة على ترميزها.)
utf-8 هو ترميز متغير العرض. يقوم بتشفير كل رمز باستخدام واحد إلى أربعة بايتات 8 بت. يتم ترميز الرموز ذات قيم النقطة الرمزية الأدنى باستخدام عدد أقل من وحدات البايت. وبهذه الطريقة، يتم تحسين utf-8 للحالة الشائعة حيث يتم استخدام أحرف ASCII ورموز BMP الأخرى (التي تتراوح نقاط كودها من U + 000000 إلى U + 00FFFF) - بينما لا تزال تسمح بالرموز النجمي (التي تتراوح نقاطها من U + 010000 إلى U + 10FFFF) ليتم تخزينها.
MySQL’s <code>utf8</code>
لفترة طويلة، كنت أستخدم الترميز utf8 ل قواعد البيانات والجداول والأعمدة، على افتراض أنه بإستخدام الترميز utf8 سأكون قادرا على تخزين أي رمز أريد في قاعدة البيانات الخاصة بي - أو حتى هكذا ظننت.
أثناء الكتابة عن ترميز الأحرف الداخلية لجافا سكريبت، لاحظت أنه لا توجد طريقة لإدراج رمز U + 1D306 تيتراغرام فور سينتر (𝌆) في قاعدة بيانات MySQL. كان العمود الأول يحاول تحديث ترتيب utf8_unicode_ci وتم تعيين مجموعة أحرف الاتصال إلى utf8.
يتبين أن مجموعة الأحرف utf8 الخاصة ب MySQL تطبق جزئيا بشكل صحيح ترميز utf-8 الصحيح. يمكن فقط تخزين رموز ترميز utf-8 التي تتكون من واحد إلى ثلاثة بايت؛ لا يتم دعم الرموز المشفرة التي تستغرق أربعة بايتات.
منذ astral symbols (التي تتراوح بين نقاط رمز من U + 010000 إلى U + 10FFFF) تتكون كل من أربعة بايت في utf-8، لا يمكنك تخزينها باستخدام تطبيق utf8.
هذا لا يؤثر فقط على حرف، <code>𝌆</code> ، ولكن رموز أكثر أهمية مثل U + 01F4A9 كومة من بو (💩) كذلك. في المجموع، هذا هو 1،048،575 نقاط رمز ممكن لا يمكنك استخدامها. في الواقع، يسمح utf8 الخلية فقط لتخزين 5.88٪ ((0x00FFFF + 1) / (0x10FFFF + 1)) من جميع نقاط رمز ونيكود الممكنة. صحيح utf-8 يمكن ترميز 100٪ من جميع نقاط رمز يونيكود.
MySQL’s <code>utf8mb4</code>
لحسن الحظ، MySQL 5.5.3 (صدر في أوائل عام 2010) قدم ترميز جديد يسمى utf8mb4 الذي يخطط ل utf-8 الصحيح، وبالتالي يدعم بشكل كامل يونيكود، بما في ذلك astral symbols.
مترجم من
https://mathiasbynens.be/notes/mysql-utf8mb4
مختصر الكلام
ترميز utf8 في قواعد البيانات MySQL لا يدعم كل الأحرف والرموز على سبيل المثال الصور التعبيرية Emojis .
1. بناء منتدى جديد بترميز UTF8 كاملاً
إذا كنت تعمل منتدى جديد فالأمور بسيطة لك فقط أنشىء قاعدة بيانات بترميز Collation = utf8mb4_unicode_ci
وقم بتحرير الملف
CODE
engine/libs/db.class.php
وابحث عن
CODE
// mysql_query("set character_set_server='utf8'");
// mysql_query("set names 'utf8'");
وغيرها ل
CODE
mysql_query("set character_set_server='utf8mb4'");
mysql_query("set names 'utf8mb4'");
وإذا تستعمل MySQli
تحرر الملف
CODE
engine/libs/db_mysqli.class.php
وتغير
CODE
// mysqli_query("set character_set_server='utf8'");
// mysqli_query("set names 'utf8'");
إلى
CODE
mysqli_query("set character_set_server='utf8mb4'");
mysqli_query("set names 'utf8mb4'");
مع أني لم اجرب ذلك، المفروض تعمل بلا مشاكل.
2. تحويل قاعدة بيانات من utf8 إلى utf8bm4
يمكنك عمل ذلك يدوياً بتعديل ترميز الحقول التي تريد دعم utf8 كاملا فيها مثلا حقل تغير ترميز حقل text و title في جدول pbb_subject بتغيير ترميزه ل utf8mb4_unicode_ci ... وهكذا
وجدت سكريبت يقوم بذلك ويغير كل الحقول وهو مرفق ولكن يجب أن تكون على خبرة بما تفعل وأن قاعدة بيانات منتداك بترميز utf8-utf8 وليس latin1-utf8.
كيف أعرف ترميز قاعدة بيانات منتداي؟
مبدأياً من ترميز الجداول والحقول في الجداول ولكن لا يمكن الإعتماد على ذلك دائما فقد يكون ترميز الجدول utf8_general_ci ولكن الحروف تخزن بتميز latin1 اليك هذا الطريقة البسيطة إذهب لجدول pbb_subject وانظر للأحرف فيه إذا كانت رموز فترميز الأحرف لديك latin1 ولا يصلح لك هذا الموضوع فتحويل الترميز latin1 إلى utf8mb4 يحتاج لمزيد من العمل ربما مستقبلاً أجد له محول.
إستخدام سكريبت التحويل
من الأفضل عمل نسخة إحتياط من قاعدة البيانات قبل التحويل.
حمل الملف المرفق وحرر الملف conv.php وضع فيه بيانات قاعدة البيانات ثم ارفع الملف لموقعك وقم بزيارته
سيظهر لك
Convert utf8 to utf8mb4
Start
اكبس على Start وسيقوم بالتحويل ثم اعمل التعديلات التي ذكرتها في رقم 1
(بناء منتدى جديد بترميز UTF8 كاملاً)
مبارك عليك دعم الترميز العالمي UTF-8 100% في منتداك وسيمكنك إستعمال رموز Emojis في المواضيع بدل تحولها ل ؟؟؟ سابقاً عندما كان بترميز utf8.