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