في هذا الدرس 6تصفّح المواضيع
في قواعد بيانات MySQL 8 الحديثة التي تعتمد الترميز القياسي utf8mb4، يستهلك الحرف الواحد ما بين 1 بايت و4 بايتات في الذاكرة. ولهذا السبب يوفر محرك MySQL دالتين مختلفتين تماماً لقياس الطول يجب عدم الخلط بينهما:
- دالة
CHAR_LENGTH(str): تحسب عدد الأحرف الفعلي الذي يراه المستخدم بغض النظر عن حجم البايتات؛ ولذلك يجب استخدامها دائماً عند التحقق من طول الأسماء أو كلمات المرور أو النصوص العربية. - دالة
LENGTH(str): تحسب عدد البايتات الخام في الذاكرة؛ فالحرف الإنجليزي يستهلك1 byte، بينما يستهلك كل حرف عربي2 bytes، ويستهلك رمز الإيموجي4 bytes.
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تلقائياً وتكمل دمج بقية الحقول بأمان تام.
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): تستخرج النص قبل الفاصل المحدد (بعدد موجب) أو بعده (بعدد سالب).
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.
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).
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) | اقتطاع جزء نصي | ترقيم المواضع يبدأ من الرقم 1 | SUBSTRING(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
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 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
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 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() في قواعد البيانات.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
نفّذ استعلامات SQL المشروحة في قسم طول الأحرف مقابل البايتات داخل قاعدة بيانات MySQL 8 المحلية وتأكد من مطابقة النتائج.
-
بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم دمج النصوص بدالة CONCAT_WS وقارن مخرجات الاستعلام.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي8 أسئلة تنتظرك +
أي دالة في MySQL تحسب عدد الأحرف الفعلي داخل نص عربي بترميز UTF8MB4 بدلاً من حجم البايتات؟
تعيد دالة CHAR_LENGTH() عدد الأحرف الفعلي بينما تعيد LENGTH() حجم التخزين بالبايتات.
كم بايتاً تشغله كلمة عربية مكونة من 5 أحرف في عمود بترميز utf8mb4 عند فحصها بدالة LENGTH()؟
يشغل كل حرف عربي في ترميز utf8mb4 حجم 2 بايت، وبالتالي تشغل الكلمة المكونة من 5 أحرف 10 بايتات.
ما هي القيمة التي يعيدها التعبير CONCAT("Order-", NULL, "-Confirmed") في MySQL؟
تعيد دالة CONCAT() العادية القيمة الفارغة NULL فور وجود أي معامل يساوي NULL.
تتجاهل دالة CONCAT_WS("-", "Riyadh", NULL, "SA") القيمة الفارغة NULL بأمان وتعيد النص "Riyadh-SA".
صواب؛ تتخطى دالة CONCAT_WS القيم الفارغة NULL تلقائياً دون إفساد النص المدمج.
ما هي النتيجة التي تعيدها الدالة SUBSTRING("MYSQL8", 1, 3) في MySQL؟
يبدأ ترقيم الأحرف في SQL من 1، لذا فإن اقتطاع 3 أحرف بدءاً من الموضع الأول يعيد "MYS".
ما هما الدالتان اللتان نجمعهما لإزالة المسافات الخارجية وتحويل البريد الإلكتروني إلى أحرف صغيرة؟ (اختر إجابتين)
تزيل دالة TRIM() المسافات من الطرفين وتحول دالة LOWER() الأحرف إلى صغيرة.
ما القيمة التي تعيدها دالة LOCATE("sql", "closetag") عند عدم العثور على النص الفرعي؟
تعيد دالة LOCATE() الرقم 0 عند عدم وجود النص الفرعي داخل السلسلة النصية.
في MySQL، تجري دالة REPLACE(str, from_str, to_str) مطابقة حساسة لحالة الأحرف عند البحث عن النص المراد استبداله.
صواب؛ تطابق دالة REPLACE() النص المراد استبداله بحساسية تامة لحالة الأحرف.