بناء على طلب الكثيرين ممن تواجههم هذه التساؤلات حال استخدامهم لتعليمات SQL في التعامل مع قواعد بيانات باللغة العربية كتبت فيما يلي ما حضر إلى ذهني من التلميحات التي أعتقد أنها ستكون مفيدة:
- لن أقوم هنا بشرح طريقة استخدام SQL، لمن يرغب في معرفة لغة SQL للتعامل مع قواعد البيانات أرجو زيارة الموقع http://www.mysql.com/doc/en/index.html (فيما يخص MySQL)
تأسيس الجدول ليناسب اللغة العربية
حروف اللغة العربية تعتبر من تلك الرموز الغير قياسية والتي تتجاوز قيمتها الرقمية في جدول ASCII الرقم 127، وبالتالي فإنها لا تعامل معاملة الحروف الهجائية مثلها مثل حروف اللغة الإنجليزية، لذلك فإن تأسيس جدول قاعدة بيانات يجب أن يتضمن تحديد صفة الثنائية BINARY للحقول التي ستحتوي على بيانات باللغة العربية، وإن كان ذلك غير ممكن لسبب ألآخر (كأن تكون الجداول قد تم تأسيسها فعلاً) فيمكن الاطلاع على التلميحات التالية والتي يمكن بواسطتها تجاوز هذه المشكلة.
ترتيب بيانات باللغة العربية أثناء العرض
يواجه العديد هذه المشكلة أثناء استخدامهم لتعليمة ORDER BY في ترتيب بيانات باللغة العربية (في جداول لم يتم استخدام صفة الثنائية) حيث أنهم يفاجؤن بظهور ترتيب الصفوف بشكل غير متوقع، حيث تظهر بعض حروف اللغة العربية في غير ترتيبها الصحيح، والسبب في ذلك كما ذكرنا من قبل أن العمود المستخدم لم يتصف بالثنائية BINARY، لذلك فإننا يجب أن نقوم بالتخصيص أثناء الترتيب كما في المثال التالي:
حيث ان اسم الجدول table والحقل الذي يتم الترتيب بدلالته هو field، وقد تمت إضافة BINARY قبله حتى يتم تنبيه MySQL أن بيانات الحقل يجب أن تعامل معاملة بدلالة قيمتها الرقمية وليست كحروف.كود PHP:SELECT * FROM table ORDER BY BINARY field
وفيما يلي مثال آخر لترتيب البيانات بدلالة حقل من نوع آخر (تاريخ مثلاً) وحقل نص:
حيث أن اسم الجدول table وحقل datefield حقل يمثل التاريخ، وحقل title حقل يمثل نص (باللغة العربية)كود PHP:ٍSELECT * FROM table ORDER BY datefield, BINARY title
البحث عن كلمة أو جزء من كلمة
من المعروف أن معيار البحث للتساوي = يقوم بتصفية (فلترة) البيانات المعروضة بحسب الصيغة المذكورة، لكنها أيضاً ستواجه خللاً إذا كان أحد معايير البحث يمثل باللغة العربية، لذلك وجب أيضاً استخدام BINARY، كما في المثال التالي:
كذلك الحال عند الرغبة في البحث باستخدام LIKE:كود PHP:ٍSELECT * FROM table WHERE BINARY field = 'كلمة'
البحث متعدد الشروط:كود PHP:SELECT * FROM table WHERE BINARY field LIKE '%كلمة%'
يمكن استخدام LIKE و RLIKE لعمل بحث متعدد الشروط، وسأقوم فيما يلي بذكر بعض الأمثلة الشائعة، مع شرح مقتضب لكل منها.
- الرموز المستخدمة مع LIKE
يمكن استخدام الرمز _ للدلالة على حرف واحد مجهول، ففي المثال التالي:
تطابق معايير المثال كلاً من الكلمات التالية: أحمد ، احمد ، محمد ، نحمد ، بحمدكود PHP:SELECT * FROM table WHERE BINARY field LIKE '_حمد'
يمكن استخدام الرمز % للدلالة على حرف أو عدد من الحروف أو حتى لا شيء، كما في الأمثلة التالية:
وهكذا فإن الرمز % يستخدم بدلاً عن كمية مجهولة من الحروفكود PHP:للبحث عن الأسماء التي تبدأ بحرف الألف وتنتهي بحرف الميم
SELECT * FROM table WHERE BINARY field LIKE 'أ%م'
ويطابق البحث كلاً من الكلمات التالية: أم، أمام، أنغام،...
للبحث عن الأسماء التي الاسم الأخير فيها محدد
SELECT * FROM table WHERE BINARY field LIKE '% محمد'
ويطابق البحث كلاً من الأسماء: علي محمد، أحمد عبدالله محمد،...
البحث عن وجود كلمتين داخل مقطع من البيانات دون شرط تقاربهما:
SELECT * FROM table WHERE BINARY field LIKE '%الكلمة الأولى%الكلمة الثانية%'
- عبارة RLIKE تستخدم للمقارنة باسلوب التعابير القياسية Regular Expressions باستخدام الرموز بشكل مشابه لطريقة pcre_match، يمكن معرفة المزيد عنها في http://www.mysql.com/doc/en/Regexp.html
وتعتبر RLIKE أفضل من LIKE في حالة البحث عن عبارات بشروط معقدة كالرغبة في استثناء رموز التشكيل مثلاً.
البحث باستثناء علامات التشكيل
نحتاج في بعض الأحيان إلى البحث عن عبارة داخل بيانات يحتمل وجود علامات التشكيل فيها، وبذلك لا يمكننا تنفيذ عبارة LIKE لأن التطابق غير تام بالنسبة للكلمة الواحدة، وهذا هو ما يدفعنا إلى استخدام REGEXP أو RLIKE لتنفيذ بحث يناسبنا.
والواقع أن استخدام REGEXP معقد كثيراً، ولكنني سأذكر هنا كيف بإمكاننا استخدامها للبحث عن عبارة باستثناء رموز التشكيل:
. هذا الرمز يقابل تماماً الرمز _ في LIKE لذلك سنستخدمه في بداية ونهاية نموذج البحث
* هذا الرمز يعني أي عدد من الرموز وسنستخدمه بجانب الرمز . ليماثل % في LIKE ، وكذلك سنستخدمه مع مربع نطاق الرموز لنحدد أننا نتوقع وجود أي عدد من رموز التشكيل
[...] سنستخدم هذا الشكل لتحديد نطاق رموز نتوقع وجودها أثناء البحث وهي هنا رموز التشكيل
سأستخدم هنا علامات التشكيل َ و ُ و ِ
فبالتالي فإن مربع نطاق الرموز سيكون بهذا الشكل [َُِ] (قد لا يكون واضحاً أن علامات التشكيل الثلاثة بين القوسين)
لذلك فإنني عندما أريد البحث عن كلمة ذهب مع توقعي وجود الكلمة مشكلة بالفتحة والضمة والكسرة فإنني سأقوم بعمل هذا:
كود PHP:SELECT * FROM table WHERE field RLIKE BINARY '.*ذ[َُِ]*ه[َُِ]*ب.*'



