English

النص العربي يطلع ؟؟؟؟ في MySQL: الحل مع utf8mb4

تحفظ «مرحبا» وترجع لك «?????». العَرَض، والسبب الحقيقي، والأماكن الأربعة اللي تصلحها مرة وحدة وللأبد.

· 2 دقائق قراءة
النص العربي يطلع ؟؟؟؟ في MySQL: الحل مع utf8mb4

العَرَض

الفورم يحفظ مرحبا، والقاعدة تعرض ?????. أو الصفحة تعرض مرحبا. والإيموجي في الأسماء يوقف الإدخال بخطأ Incorrect string value.

السبب

في مكان ما بين المتصفح والقرص، فيه خطوة ما تستخدم UTF-8 كامل. في MySQL، الترميز القديم utf8 هو فعليًا utf8mb3: يخزن لين ثلاث بايتات للحرف، فالإيموجي وبعض الرموز تفشل. ولو أي طبقة وحدة تستخدم latin1 أو utf8mb3، النص يتخرب أو يتبدل بـ ?.

فيه أربع طبقات، ولازم الأربع يتفقون.

الحل

1. قاعدة البيانات

ALTER DATABASE app CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

2. كل جدول (الأعمدة الموجودة ما تتغير لحالها)

ALTER TABLE messages CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

والجداول الجديدة أنشئها فيه صراحة:

CREATE TABLE posts (...) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

3. الاتصال. في Node.js مع mysql2، حدد الترميز في الـ pool:

import mysql from 'mysql2/promise';
const pool = mysql.createPool({ host, user, password, database, charset: 'utf8mb4' });

4. النسخ الاحتياطي والاستيراد. لازم تنقرأ وتنكتب بنفس الترميز:

mysqldump --default-character-set=utf8mb4 app > app.sql
mysql --default-character-set=utf8mb4 app < app.sql

تأكد

SHOW VARIABLES LIKE 'character_set_%';
SELECT TABLE_NAME, TABLE_COLLATION FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'app';

بعدها أدخل مرحبا 👋 واقراه. لو الاثنين سليمين، كل الطبقات مضبوطة.

البيانات اللي خربت من قبل

الصفوف اللي انحفظت ? راحت، لأن الحروف تبدلت قبل ما تنحفظ. أما اللي شكلها مرحبا فهي مرمّزة مرتين، وغالبًا تنصلح بتحويلها عبر latin1 ورجوعها. جرّب على نسخة أول.

الأسئلة الشائعة

utf8mb4_unicode_ci ولا utf8mb4_0900_ai_ci؟

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

هل هذا يأثر على البحث بالعربي؟

الترتيب (Collation) يحدد كيف ينقارن النص وينرتب. الاثنين فوق يتعاملون مع الحروف العربية، وللبحث العربي المتقدم (تجاهل التشكيل أو أشكال الحروف) توحّد النص قبل الحفظ.


صادفت مشكلة مثل هذي في مشروعك؟ المحرّر في ahmed-adil.com يوصلها لأحمد.

المزيد من الملحق