MariaDB / دليل حلول تحريري
تشخيص الترتيبات اللغوية غير المتوافقة في المقارنة
تتبع مجموعة المحارف والترتيب وأولوية التحويل للطرفين قبل علاج الاستعلام، وحافظ على قواعد المساواة المطلوبة.
قاعدة معرفة للقراءة فقط · بلا تعليقات عامة
تعرّف على الأعراض
يفشل ربط أو UNION أو مقارنة أو روتين برسالة ERROR 1267 (HY000): Illegal mix of collations رغم نجاح قراءة كل جدول منفرداً. قد تظهر أخطاء ترتيب مشابهة. احفظ التعبير وترتيبي الطرفين؛ لا تثبت رسالة المقارنة فساد العربية المخزنة.
افهم الأسباب المحتملة
- قد ترث الأعمدة والقيم والمعاملات والكائنات ترتيبات مختلفة. تحسم MariaDB التعابير وفق أولوية التحويل، وقد يفشل طرفان متساويا القوة غير متوافقين. لا يحول تغيير افتراض القاعدة كل الأعمدة، وقد يغيب اسم خاص بـ MySQL عن MariaDB.
افحص تعريف العمودين والجلسة
اختصر العبارة إلى المقارنة وحدد عمودي المصدر أو التعبيرين. افحص بيانات الأعمدة وإعدادات الاتصال في جلسة مصرح لها. لا يكفي افتراض الجدول لأن العمود قد يخالفه. إذا ظهر الخطأ في التطبيق فقط فقارن إعدادات اتصال المعاملات بالأداة الناجحة. تعتمد النتائج على البيئة ولا نختلق مخرجات.
SELECT TABLE_NAME, COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'harbor_lab'
AND TABLE_NAME IN ('customers', 'imported_customers')
ORDER BY TABLE_NAME, ORDINAL_POSITION;
SELECT @@character_set_connection, @@collation_connection;
حدد القاعدة والجداول بهدف التشخيص الاصطناعي. تعتمد الرؤية على الصلاحيات.
افحص التعابير لا التخزين وحده
تصف CHARSET() وCOLLATION() وCOERCIBILITY() التعبير. تملك COLLATE الصريحة أولوية أعلى من العمود أو القيمة العادية، لكن قوتها لا تجعلها القاعدة التجارية الصحيحة. قد تدخل الدمج والتحويل ومعاملات الروتين ترتيباً جديداً. يفحص المثال تعبير utf8mb4 مقصوداً، ولا يغير البيانات أو يثبت ما يرسله اتصال التطبيق.
SELECT CHARSET(_utf8mb4'Harbor' COLLATE utf8mb4_unicode_ci),
COLLATION(_utf8mb4'Harbor' COLLATE utf8mb4_unicode_ci),
COERCIBILITY(_utf8mb4'Harbor' COLLATE utf8mb4_unicode_ci);
الخصائص المتوقعة: utf8mb4 وutf8mb4_unicode_ci وأولوية 0 للترتيب الصريح.
طبق سياسة مقارنة محددة
عندما يكون الطرفان utf8mb4 وتلزم المقارنة غير الحساسة المختارة، تزيل COLLATE المتوافقة الصريحة الالتباس في ربط تشخيصي للقراءة. إذا اختلفت المجموعتان فحول التعبير لمجموعة مشتركة قادرة بعد فحص التمثيل. للمقارنة الثنائية مساواة مختلفة وليست علاجاً عاماً. قد يؤثر تحويل الاستعلام في الفهرسة، لذا افحص الخطة والنتائج.
SELECT c.customer_id, i.import_id
FROM customers AS c JOIN imported_customers AS i
ON c.label COLLATE utf8mb4_unicode_ci
= i.label COLLATE utf8mb4_unicode_ci
ORDER BY c.customer_id, i.import_id;
يفترض النمط أن العمودين utf8mb4 وأن التكافؤ المختار مقصود.
افصل التشخيص عن ترحيل المخطط
إذا كانت التعريفات غير المتسقة السبب فاقترح سياسة مخطط وموصل بترحيل مراجع مستقل. قبل تحويل الأعمدة اختبر تعارض UNIQUE والحالة والعلامات والفرز وحفظ العربية على نسخة. تغير اختيار الترتيب الافتراضي لمجموعة Unicode المسماة صراحة دون COLLATE في MariaDB 11.5، وتغيرت مجموعة المحارف والترتيب الافتراضيان للخادم في 11.6. والإصدار 11.8 أول إصدار بدعم طويل الأمد يجمع التغييرين، لذلك قد يظهر أثرهما معاً بعد الترقية من إصدار أسبق بدعم طويل الأمد. لا يتضمن الدليل ALTER TABLE أو إعدادات عامة؛ إزالة الرسالة وحدها لا تثبت سلامة المساواة الجديدة.
تحقق من نجاح الإصلاح
أعد المقارنة المختصرة والتقرير الكامل وافحص المطابق وغير المطابق وNULL. قارن الأعداد والمعرفات ولا تكتفِ بالنجاح. افحص EXPLAIN إذا أثر التحويل في الفهرسة، وأكد النتيجة عبر موصل التطبيق وإعداداته المقصودة.
امنع تكرار المشكلة
- صرح بالمحارف والترتيب في الترحيلات والموصل، واحصر التعريفات المستوردة واختبر التفرد عند تغيير الإصدار أو المنتج. افصل متطلبات عرض اللغة عن مقارنة المعرف التجاري.