انتقل إلى محتوى الدرس
الدرس 34
دورة MySQL

دوال معالجة النصوص وحساب طول النصوص العربية UTF8MB4 في MySQLMySQL String Functions and Multibyte UTF8MB4 Length

تعلّم دوال معالجة النصوص وحساب طول النصوص العربية UTF8MB4 في MySQL بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
أقسام الدرس
6
الأمثلة
5
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
8
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

في قواعد بيانات MySQL 8 الحديثة التي تعتمد الترميز القياسي utf8mb4، يستهلك الحرف الواحد ما بين 1 بايت و4 بايتات في الذاكرة. ولهذا السبب يوفر محرك MySQL دالتين مختلفتين تماماً لقياس الطول يجب عدم الخلط بينهما:

  • دالة CHAR_LENGTH(str): تحسب عدد الأحرف الفعلي الذي يراه المستخدم بغض النظر عن حجم البايتات؛ ولذلك يجب استخدامها دائماً عند التحقق من طول الأسماء أو كلمات المرور أو النصوص العربية.
  • دالة LENGTH(str): تحسب عدد البايتات الخام في الذاكرة؛ فالحرف الإنجليزي يستهلك 1 byte، بينما يستهلك كل حرف عربي 2 bytes، ويستهلك رمز الإيموجي 4 bytes.
مخطط يقارن بين CHAR_LENGTH و LENGTH للنصوص متعددة البايتات UTF8MB4 ودوال الدمج CONCAT_WS والاقتطاع والتنظيف في MySQL 8
SQL
SELECT
  CHAR_LENGTH('CloseTag') AS en_chars,
  LENGTH('CloseTag') AS en_bytes,
  CHAR_LENGTH(_utf8mb4 0xD985D8B5D8B1) AS ar_chars,
  LENGTH(_utf8mb4 0xD985D8B5D8B1) AS ar_bytes;

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

  • دالة CONCAT(str1, str2, ...): تدمج النصوص متتالية، لكنها تحمل سلوكاً خطراً مع القيم الفارغة؛ فإذا كان أي مدخل واحداً يساوي NULL تصبح النتيجة الكاملة NULL.
  • دالة CONCAT_WS(separator, str1, str2, ...): تأخذ الفاصل النصي كأول معامل، وتتميز بأنها تتجاهل القيم الفارغة NULL تلقائياً وتكمل دمج بقية الحقول بأمان تام.
SQL
SELECT
  customer_id,
  CONCAT(first_name, ' ', last_name) AS full_name,
  CONCAT_WS(' - ', city, district, postal_code) AS full_address
FROM customers
WHERE is_active = 1;

لاقتطاع جزء محدد من سلسلة نصية — مثل رمز الدولة من كود المنتج، أو أول 3 أحرف من المعرف، أو اسم النطاق من البريد الإلكتروني — نستخدم دوال الاقتطاع النصي في MySQL:

  • دالة SUBSTRING(str, pos, len): تقتطع عدداً من الأحرف مقداره len بدءاً من الموضع pos (حيث يبدأ الترقيم في SQL من الرقم 1 وليس 0).
  • دالتا LEFT(str, len) وRIGHT(str, len): لاستخراج أول أو آخر عدد محدد من الأحرف مباشرة.
  • دالة SUBSTRING_INDEX(str, delim, count): تستخرج النص قبل الفاصل المحدد (بعدد موجب) أو بعده (بعدد سالب).
SQL
SELECT
  sku_code,
  SUBSTRING(sku_code, 1, 3) AS category_prefix,
  RIGHT(sku_code, 4) AS serial_tail,
  SUBSTRING_INDEX(email, '@', -1) AS email_domain
FROM users
LIMIT 5;

كثيراً ما تحتوي مدخلات نماذج المستخدمين على مسافات فارغة غير مقصودة في البداية أو النهاية مع اختلاف حالة الأحرف الإنجليزية. لتنظيف وتوحيد النصوص برمجياً داخل SQL نستخدم:

  • دوال TRIM(str) وLTRIM(str) وRTRIM(str): لإزالة المسافات الزائدة من الطرفين أو من اليسار أو اليمين، كما تدعم صيغة TRIM(BOTH '/' FROM path) إزالة رموز مخصصة.
  • دالتي LOWER(str) وUPPER(str): لتحويل الأحرف الإنجليزية إلى صغيرة أو كبيرة بالكامل.
  • دالة LPAD(str, len, pad): لإكمال طول النص برموز بادئة ثابتة مثل أصفار الفواتير 000042.
SQL
SELECT
  LPAD(order_id, 6, '0') AS invoice_no,
  LOWER(TRIM(customer_email)) AS normalized_email,
  UPPER(country_iso) AS country_code
FROM orders
WHERE status = 'paid';

لتحديد موقع كلمة فرعية داخل نص أو استبدال جزء من النص بآخر في استعلامات العرض والتحديث، يوفر MySQL الدوال التالية:

  • دالة LOCATE(substr, str): تعيد رقم الموضع (يبدأ من 1) لأول ظهور للنص الفرعي substr داخل str، أو تعيد 0 عند عدم وجوده.
  • دالة REPLACE(str, from_str, to_str): تستبدل كل ظهور للنص القديم بالنص الجديد، وتتميز بأنها حساسة لحالة الأحرف (Case-Sensitive).
SQL
SELECT
  article_slug,
  LOCATE('mysql', article_slug) AS match_pos,
  REPLACE(article_slug, 'http://', 'https://') AS secure_url,
  REPLACE(phone_raw, ' ', '') AS compact_phone
FROM articles;

يلخص الجدول المرجعي التالي أهم دوال معالجة النصوص في MySQL 8 وسلوكها مع ترميز UTF8MB4 والقيم الفارغة:

الدالة النصيةالوظيفة الأساسيةالسلوك مع UTF8MB4 و NULLمثال تطبيقي
CHAR_LENGTH(s)حساب عدد الأحرفتعد الأحرف العربية والإيموجي بدقةCHAR_LENGTH(name)
LENGTH(s)حساب حجم البايتات2 بايت للحرف العربي و4 للإيموجيLENGTH(name)
CONCAT_WS(sep, ...)الدمج مع فاصلتتجاهل القيم الفارغة NULL بأمانCONCAT_WS('-', a, b)
SUBSTRING(s, p, l)اقتطاع جزء نصيترقيم المواضع يبدأ من الرقم 1SUBSTRING(sku, 1, 3)
TRIM(s) / LOWER(s)التنظيف والتصغيرإزالة المسافات وتوحيد الأحرف الصغيرةLOWER(TRIM(email))
REPLACE(s, a, b)استبدال نص فرعيمطابقة حساسة لحالة الأحرفREPLACE(tel, '-', '')
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

أتقنت في هذا الدرس الفرق الجوهري بين CHAR_LENGTH() وLENGTH() عند التعامل مع النصوص العربية بترميز UTF8MB4، والدمج الآمن بوجود القيم الفارغة عبر CONCAT_WS()، واقتطاع النصوص بـ SUBSTRING()، وتنظيف المسافات بـ TRIM()، والاستبدال بـ REPLACE().

الخطوة التالية والدرس القادم

انتقل الآن إلى الدرس الخامس والثلاثين «الدوال الرقمية والرياضية والتقريب الحسابي في MySQL» لاحتراف دوال التقريب ROUND() والقص TRUNCATE() والحدود الصحيحة.

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 String Functions دوال النصوص
تعلّم دوال معالجة النصوص وحساب طول النصوص العربية UTF8MB4 في MySQL بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
للمراجعة
02 CHAR LENGTH vs Byte LENGTH طول الأحرف مقابل البايتات
المفهوم الهندسي وصياغة استعلام SQL القياسية لقسم طول الأحرف مقابل البايتات في MySQL 8.
للمراجعة
03 Joining Strings with CONCAT WS دمج النصوص بدالة CONCAT_WS
المفهوم الهندسي وصياغة استعلام SQL القياسية لقسم دمج النصوص بدالة CONCAT_WS في MySQL 8.
للمراجعة
04 Extracting Substrings and Slicing اقتطاع النص بدالة SUBSTRING
المفهوم الهندسي وصياغة استعلام SQL القياسية لقسم اقتطاع النص بدالة SUBSTRING في MySQL 8.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 UTF8MB4 UTF8MB4
UTF-8 Multibyte 4-Byte Encoding
الترميز القياسي الافتراضي في MySQL 8 ويدعم من 1 إلى 4 بايتات لكل حرف شاملاً العربية والإيموجي.
للمراجعة
02 ASCII ASCII
American Standard Code for Information Interchange
ترميز أحادي البايت للأحرف الإنجليزية الأساسية تتساوى فيه نتيجة CHAR_LENGTH مع LENGTH.
للمراجعة
03 SKU SKU
Stock Keeping Unit
رمز تعريف المنتج القياسي في المخازن وغالباً ما يُعالج بدوال الاقتطاع SUBSTRING و LEFT.
للمراجعة
04 ISO ISO
International Organization for Standardization
رموز الدول والعملات القياسية التي تُنسق بأحرف كبيرة عبر دالة UPPER() في قواعد البيانات.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. نفّذ استعلامات SQL المشروحة في قسم طول الأحرف مقابل البايتات داخل قاعدة بيانات MySQL 8 المحلية وتأكد من مطابقة النتائج.

  2. بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم دمج النصوص بدالة CONCAT_WS وقارن مخرجات الاستعلام.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

8أسئلة 3أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي8 أسئلة تنتظرك
01

أي دالة في MySQL تحسب عدد الأحرف الفعلي داخل نص عربي بترميز UTF8MB4 بدلاً من حجم البايتات؟

تعيد دالة CHAR_LENGTH() عدد الأحرف الفعلي بينما تعيد LENGTH() حجم التخزين بالبايتات.

02

كم بايتاً تشغله كلمة عربية مكونة من 5 أحرف في عمود بترميز utf8mb4 عند فحصها بدالة LENGTH()؟

يشغل كل حرف عربي في ترميز utf8mb4 حجم 2 بايت، وبالتالي تشغل الكلمة المكونة من 5 أحرف 10 بايتات.

03

ما هي القيمة التي يعيدها التعبير CONCAT("Order-", NULL, "-Confirmed") في MySQL؟

تعيد دالة CONCAT() العادية القيمة الفارغة NULL فور وجود أي معامل يساوي NULL.

04

تتجاهل دالة CONCAT_WS("-", "Riyadh", NULL, "SA") القيمة الفارغة NULL بأمان وتعيد النص "Riyadh-SA".

صواب؛ تتخطى دالة CONCAT_WS القيم الفارغة NULL تلقائياً دون إفساد النص المدمج.

05

ما هي النتيجة التي تعيدها الدالة SUBSTRING("MYSQL8", 1, 3) في MySQL؟

يبدأ ترقيم الأحرف في SQL من 1، لذا فإن اقتطاع 3 أحرف بدءاً من الموضع الأول يعيد "MYS".

06

ما هما الدالتان اللتان نجمعهما لإزالة المسافات الخارجية وتحويل البريد الإلكتروني إلى أحرف صغيرة؟ (اختر إجابتين)

تزيل دالة TRIM() المسافات من الطرفين وتحول دالة LOWER() الأحرف إلى صغيرة.

07

ما القيمة التي تعيدها دالة LOCATE("sql", "closetag") عند عدم العثور على النص الفرعي؟

تعيد دالة LOCATE() الرقم 0 عند عدم وجود النص الفرعي داخل السلسلة النصية.

08

في MySQL، تجري دالة REPLACE(str, from_str, to_str) مطابقة حساسة لحالة الأحرف عند البحث عن النص المراد استبداله.

صواب؛ تطابق دالة REPLACE() النص المراد استبداله بحساسية تامة لحالة الأحرف.