سؤال

لدي عرض جدول (مرتبط بقاعدة بيانات) وشريط بحث.عندما أكتب شيئًا ما في شريط البحث، أقوم بإجراء بحث سريع في قاعدة البيانات وأعرض النتائج أثناء الكتابة.

يبدو الاستعلام كما يلي:

SELECT * FROM MyTable WHERE name LIKE '%NAME%'

كل شيء يعمل بشكل جيد طالما أنني أستخدم أحرف ASCII فقط.ما أريده هو كتابة أحرف ASCII ومطابقة ما يعادلها مع علامات التشكيل.على سبيل المثال، إذا كتبت "Alizee" أتوقع أن تتطابق مع "Alizée".

هل هناك طريقة لجعل الاستعلام غير حساس للغة؟لقد لاحظت خيار COLLATE في SQL، ولكن يبدو أنه لا فائدة من SQLite. لقد لاحظت أيضًا أن iPhone SDK 3.0 يحتوي على "ترتيب محلي" ولكن لم أتمكن من العثور على أي وثائق حول ما يعنيه هذا.. .

شكرًا لك.

هل كانت مفيدة؟

المحلول

هناك بعض الخيارات لحل هذا:

  1. استبدال جميع الأحرف المحركة في الاستعلام قبل تنفيذه ، على سبيل المثال

    "Psychédélices" => "Psychedelices"
    "À contre-courant" => "À contre-courant"
    "عاصفة" => "عاصفة"
    إلخ.

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

  2. استخدام مكتبة تابعة لجهة خارجية، وهي ICU (الروابط أدناه).لست متأكدًا مما إذا كان هذا هو الخيار الأفضل لجهاز iPhone بالرغم من ذلك.

  3. كتابة واحدة أو أكثر من وظائف C المخصصة التي ستقوم بإجراء المقارنة.المزيد في الروابط أدناه.

بعض المنشورات هنا على StackOverflow التي تناقش الخيارات المختلفة:
كيفية فرز النص في sqlite3 مع لغة محددة؟
ترتيب سلسلة UTF-8 غير حساس لحالة الأحرف لـ SQLite (C/C++)
كيفية تنفيذ البحث غير الحساس لللكنة/علامات التشكيل في Sqlite؟

وأيضا بعض الروابط الخارجية:
SQLite ودعم UNICODE الأصلي في C/C++
حالة sqlite وعمليات البحث غير الحساسة لللكنة

نصائح أخرى

وأنا لست متأكدا من SQL، ولكن اعتقد انه يمكن بالتأكيد استخدام NSDiacriticInsensitivePredicateOption مقارنة NSStrings في الذاكرة.

ومثال أن يكون NSArray كامل من السلاسل كنت تبحث من جديد. هل يمكن تكرار ما يزيد قليلا على مجموعة مقارنة سلاسل باستخدام NSDiacriticInsensitivePredicateOption كخيار المقارنة الخاصة بك وعرض مباريات ناجحة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top