WPML

ما هي مجموعات الأحرف (Character Sets) وترتيبات المقارنة (Collations) في MySQL؟

عندما يخزن WordPress محتوى موقعك في قاعدة البيانات (مثل المقالات، والعناوين، والسلاسل النصية المترجمة، وما إلى ذلك)، فإنه يستخدم مجموعة أحرف (character set) لتمثيل الأحرف وترتيب مقارنة (collation) لتحديد كيفية مقارنة هذه الأحرف وفرزها.

مجموعة الأحرف (Charset)
تحدد كيفية تخزين الأحرف في قاعدة البيانات — وبشكل أساسي، ما هي البايتات التي تمثل كل حرف.
ترتيب المقارنة (Collation)
يحدد قواعد مقارنة تلك الأحرف (على سبيل المثال، حساسية حالة الأحرف، وحساسية التشكيل، وترتيب الفرز).

لماذا يهم هذا الأمر في المواقع متعددة اللغات

يدعم WPML المحتوى متعدد اللغات، والذي يتضمن غالباً:

  • أحرفاً خاصة (مثل ñ، é، ö)
  • نصوصاً غير لاتينية (مثل العربية، واليابانية، والصينية، والعبرية)
  • رموزاً تعبيرية ورموزاً أخرى (مثل 🎉، ✔️، وما إلى ذلك)

يتطلب العديد من هذه الأحرف أكثر من 3 بايت لتخزينها بشكل صحيح. إذا كانت قاعدة بياناتك تستخدم ترتيب مقارنة غير متوافق، فقد تُفقد الأحرف، أو تُستبدل بـ �، أو تتسبب في أخطاء في قاعدة البيانات (مثل «Incorrect string value»).

لهذا السبب نوصي بشدة باستخدام ترتيب مقارنة يدعم أحرف Unicode بحجم 4 بايت.

توصيتنا

استخدم مجموعة الأحرف utf8mb4 وترتيب مقارنة متوافقاً مع Unicode، مثل:

  • utf8mb4_unicode_ci – متوافق على نطاق واسع، وهو خيار افتراضي جيد
  • utf8mb4_unicode_520_ci – تعامل أفضل مع Unicode في إصدارات MySQL 5.6 وما بعدها
  • utf8mb4_general_ci – أسرع قليلاً، ولكنه أقل دقة في مقارنة Unicode
  • utf8mb4_bin – حساس لحالة الأحرف والتشكيل (مقارنة ثنائية)

كل هذه الخيارات آمنة للاستخدام مع WPML.


هام: تدعم مجموعة الأحرف utf8 القديمة في MySQL ما يصل إلى 3 بايت فقط لكل حرف. لا يمكنها التعامل مع بعض الأحرف مثل الرموز التعبيرية أو بعض الرموز التصويرية. تجنّب استخدامها للمحتوى متعدد اللغات.

ما هو الخيار الافتراضي في MySQL؟

إصدار MySQLمجموعة الأحرف الافتراضيةترتيب المقارنة الافتراضيمتوافق مع Unicode
< 5.5latin1latin1_swedish_ciلا
5.5.xutf8utf8_general_ciلا
5.7+utf8mb4utf8mb4_general_ci / utf8mb4_unicode_ciنعم
8.0+utf8mb4utf8mb4_0900_ai_ciنعم

قد لا يتبع WordPress دائماً الخيار الافتراضي في MySQL — حيث يمكنه تجاوزه عبر الإعدادات أو عمليات الترحيل.

ضبط مجموعة الأحرف وترتيب المقارنة للمواقع الجديدة

لضمان إنشاء WordPress لجداول جديدة بمجموعة الأحرف وترتيب المقارنة الصحيحين، حدد ما يلي في ملف wp-config.php الخاص بك:

define( 'DB_CHARSET', 'utf8mb4' ); // If you have utf8 that's fine, WP will automatically map it as utf8mb4
define( 'DB_COLLATE', 'utf8mb4_unicode_ci' );

سيُطبّق هذا على عمليات التثبيت الجديدة والجداول المنشأة حديثاً.

التحقق من مجموعة الأحرف وترتيب المقارنة للمواقع والجداول الحالية

إليك كيفية التحقق من مجموعة الأحرف وترتيب المقارنة في مواقعك الحالية.

الخيار 1 phpMyAdmin

  1. اذهب إلى قاعدة بيانات موقعك.
  2. تحقق من عمود «Collation» بجوار كل جدول.
  3. انقر على جدول لعرض ترتيب المقارنة الخاص بكل عمود على حدة.

الخيار 2 WP-CLI

bash

wp db query "SELECT TABLE_NAME, TABLE_COLLATION FROM information_schema.tables WHERE table_schema = 'your_db_name';"

يمكنك أيضاً فحص الأعمدة الفردية:

bash

wp db query "SHOW FULL COLUMNS FROM wp_posts;"

إذا رأيت أن ترتيب المقارنة يبدأ بـ utf8mb4_، فهو جاهز لدعم جميع أنواع unicode والرموز التصويرية بحجم 4 بايت. وتكون مجموعة الأحرف أيضاً جيدة.

إذا رأيت شيئاً آخر، على سبيل المثال utf8_*، فستحتاج إلى تغييره.

يُرجى ملاحظة أن ترتيب المقارنة يمكن أن يختلف من عمود لآخر.

تحديث مجموعة الأحرف وترتيب المقارنة للجداول والأعمدة الحالية

يؤثر تحديث الثابتين DB_CHARSET و DB_COLLATE في ملف wp-config.php على الجداول الجديدة فقط. لتطبيق التغييرات على الجداول والأعمدة الحالية، يجب عليك تحويلها يدوياً باستخدام SQL.

نوصي أيضاً بتحديث ترتيب المقارنة الافتراضي لقاعدة البيانات في MySQL باستخدام الأمر التالي:

ALTER DATABASE your_database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

ابدأ دائماً بنسخة احتياطية

قبل تشغيل أي استعلامات تحويل:

  • صدّر قاعدة بياناتك باستخدام phpMyAdmin أو mysqldump
  • احفظها بأمان تحسباً لحدوث أي خطأ

تحذير: قد تفشل تحديثات ترتيب المقارنة في الوضع الصارم (Strict Mode)

عند تحديث ترتيب المقارنة لجدول كامل (أو قاعدة بيانات)، قد تقوم MySQL بإعادة بناء الجداول وإعادة التحقق من جميع القيم الافتراضية للأعمدة — بما في ذلك الأعمدة غير ذات الصلة مثل DATETIME. إذا كانت قاعدة بياناتك تعمل في وضع SQL الصارم (STRICT_TRANS_TABLES، NO_ZERO_DATE)، فإن الأعمدة ذات القيم الافتراضية مثل «0000-00-00 00:00:00» ستؤدي إلى أخطاء مثل:

#1067 - Invalid default value.

ما هو الوضع الصارم (Strict Mode)؟

يتحكم الوضع الصارم في كيفية تعامل MySQL مع القيم غير الصالحة أو المفقودة عند إضافة بيانات أو تحديثها في قاعدة البيانات. يمكن أن تكون القيمة غير صالحة لعدة أسباب. على سبيل المثال، قد يكون لها نوع بيانات خاطئ للعمود، أو قد تكون خارج النطاق المسموح به.

يمكنك العثور على معلومات حول الأنواع المختلفة للتحقق من صحة البيانات للوضع الصارم في وثائق MySQL.

كيف يؤثر الوضع الصارم على قاعدة بيانات موقع WordPress

بشكل افتراضي، يستخدم WordPress القيمة «0000-00-00 00:00:00» كقيمة افتراضية لبعض أعمدة datetime، وهو ما لا يقبله الوضع الصارم NO_ZERO_DATE.

لاحظ أن هذه القيم الافتراضية كانت مسموحة أثناء الإنشاء الأصلي للجدول (على سبيل المثال، أثناء إعداد WordPress)، ولكنها تفشل عند إجراء عمليات ALTER في البيئات الصارمة.

كيفية التحقق مما إذا كان الوضع الصارم ممكّناً

شغّل الأمر التالي:

SELECT @@SESSION.sql_mode, @@GLOBAL.sql_mode;

ابحث عن:

  • STRICT_TRANS_TABLES
  • STRICT_ALL_TABLES
  • NO_ZERO_DATE

إذا وجدت أياً من هذه القيم، فهذا يعني أن الوضع الصارم ممكّن.

لتجنب الأخطاء أثناء تحديثات مجموعة الأحرف وترتيب المقارنة، لا تحتاج إلا إلى تعطيل الوضع الصارم NO_ZERO_DATE.

كيفية المتابعة بأمان

قم بأحد الإجراءات التالية للمتابعة بأمان:

1. تجنب تعديل الأعمدة والجداول إلا إذا كان ترتيب المقارنة يحتاج فعلياً إلى التغيير.

2. عطّل الوضع الصارم مؤقتاً للجلسة الحالية فقط أثناء تشغيل استعلامات التحويل. يمكنك القيام بذلك باستخدام الأمر التالي:

SET SESSION sql_mode = REPLACE(@@sql_mode, 'NO_ZERO_DATE', '');

ملاحظة: هناك خطط مستقبلية لـ MySQL لدمج الأوضاع الصارمة.

في حال وجود مشكلات أخرى خاصة ببياناتك، قد ترغب في تعطيل أي وضع صارم باستخدام الأمر التالي:

SET SESSION sql_mode = '';

استعلامات لتحويل البيانات

تحويل قاعدة البيانات بالكامل

يقوم ما يلي بإنشاء استعلام ALTER TABLE لكل جدول في قاعدة بياناتك:

SELECT CONCAT(
  'ALTER TABLE `', TABLE_NAME, '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;'
) AS query
  FROM INFORMATION_SCHEMA.TABLES
  WHERE TABLE_SCHEMA = 'your_database_name';

شغّل الاستعلامات الناتجة في phpMyAdmin، أو انسخها والصقها في MySQL CLI / WP-CLI.

يضمن هذا أن جميع الجداول في قاعدة بياناتك تعتمد مجموعة الأحرف وترتيب المقارنة الجديدين.

تحويل جدول معين اختياري/إضافي
ALTER TABLE wp_posts 
  CONVERT TO CHARACTER SET utf8mb4 
  COLLATE utf8mb4_unicode_ci;

يُحدّث هذا جميع الأعمدة النصية في جدول wp_posts لاستخدام utf8mb4 وترتيب المقارنة المحدد.


تحويل عمود معين اختياري/إضافي
ALTER TABLE wp_posts 
  CHANGE post_title post_title TEXT 
  CHARACTER SET utf8mb4 
  COLLATE utf8mb4_unicode_ci;

ملاحظة:

  • يجب عليك إعادة تعريف العمود بالكامل (النوع، الاسم) في CHANGE.
  • تأكد من أن نوع العمود يطابق النوع الحالي.

الأخطاء الشائعة عند التحويل

إليك خطأين شائعين قد تواجههما عند تحويل الجداول والأعمدة.

عدم تطابق مجموعة الأحرف وترتيب المقارنة
-- INVALID: utf8 collation with utf8mb4 charset
ALTER TABLE wp_posts CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8_general_ci;
-- Error: COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'utf8mb4'

الحل:

  • استخدم ترتيب مقارنة مطابقاً: utf8mb4_*

حد طول مفتاح الفهرس (Index key length limit)
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes

في بعض الإعدادات، وخاصة لإصدارات MySQL الأقدم من 5.7، قد يتم تجاوز الحد الأقصى لطول مفتاح الفهرس عند إضافة بايت إضافي واحد لكل حرف.

الحل:

  • قم بتقصير VARCHAR(255) المفهرس إلى VARCHAR(191) إذا لزم الأمر
  • أو بادر بالترقية إلى إصدار MySQL 5.7 أو أحدث، وتأكد من تمكين innodb_large_prefix

ملخص

  • استخدم مجموعة الأحرف utf8mb4 للحصول على دعم كامل لـ Unicode
  • استخدم ترتيبات مقارنة متوافقة: utf8mb4_unicode_ci، utf8mb4_0900_ai_ci، وما إلى ذلك
  • حدّث wp-config.php للجداول الجديدة
  • شغّل عمليات ترحيل SQL لإصلاح الجداول الحالية
  • لا تخلط أبداً بين مجموعات الأحرف وترتيبات المقارنة — سترفضها MySQL أو تتسبب في تعطلها.