Knex: حساسية حالة الأحرف في الاستعلامات

تم إنشاؤها على ٣ أبريل ٢٠١٤  ·  28تعليقات  ·  مصدر: knex/knex

يبدو أن knex (وبالتالي رف الكتب) ليس لديه أي طريقة للتعامل مع حساسية حالة الأحرف ، مما يؤدي إلى نتائج غير متسقة عبر قواعد البيانات المختلفة المدعومة.

SQLite حساس لحالة الأحرف بشكل افتراضي.
تعتمد MySQL على التجميع ، ولكنها عادةً ما تكون غير حساسة لحالة الأحرف
PostGRES غير متأكد ؟؟

في قضية ذات صلة في Ghost فيما يتعلق بأسماء العلامات التي يجب أن تكون فريدة من نوعها حساسة لحالة الأحرف ، ذكر halfdan أن ActiveRecord (الذي أعرف أن الكثير من عناصر أرفف الكتب الحديثة يعتمد عليه) يسمح بتحديد ذلك على أساس كل استعلام:

http://edgeguides.rubyonrails.org/active_record_validations.html#uniqueness

في الوقت الحالي ، لا يمكنني العثور على طريقة لتقديم استعلامات حساسة لحالة الأحرف أو غير حساسة لحالة الأحرف على وجه التحديد عبر قواعد البيانات الثلاثة ، ولذا يتعين علينا إجراء عملية إحضار الكل في JS. لقد أثرت أيضًا https://github.com/tgriesser/knex/issues/152 أثناء التحقيق في هذا مسبقًا فيما يتعلق بعناوين البريد الإلكتروني.

يبدو وكأنه شيء أساسي إلى حد معقول للعمل مع ديسيبلات متعددة؟ كالمعتاد مع رف الكتب / knex ليس لدي أي فكرة من أين أبدأ في البحث عن إصلاح هذا (انظر أيضًا https://github.com/tgriesser/knex/issues/46#issuecomment-33230040) ، لذلك إذا كان لدى أي شخص إرشادات ، أحب المساعدة في إصلاحه.

PR please feature request

التعليق الأكثر فائدة

+1 مني ، سيكون ذلك رائعًا. إليك حلjimmynavio ، تم تعديله باستخدام أحرف البدل للعثور على أي شيء يحتوي على القيمة 🍡

.whereRaw("LOWER(column) LIKE '%' || LOWER(?) || '%' ", value) 

ال 28 كومينتر

Postgres حساس لحالة الأحرف. أستخدم LOWER (حقل) = 'some_lower_case_value'

سيكون من الرائع رؤية شيء مثل ".case (boolean_value)"

tgriesser أي تحديث على هذا؟

أحب أن أرى شيئًا كهذا

بينغ

أود أن أرى هذا مطبقًا.

كعمل حول يمكنك استخدام whereRaw. فقط تأكد من التعقيم!
للبحث الكامل غير الحساس لحالة الأحرف في عمود ، أستخدم ما يلي:
.whereRaw ('LOWER (عمود) مثل؟' ​​، '٪' + value.toLowerCase () + '٪') ؛

MySQL غير حساس لحالة الأحرف. يحتاج المنسق إلى السماح بـ LIKE BINARY و REGEXP BINARY

jimmynavio +1 وفر لي بعض الوقت في الحل البديل الخاص بك

أوافق على أن إجراء مقارنة غير حساسة للحالة المحمولة للوظيفة where سيكون أمرًا رائعًا. لست متأكدا بالضبط كيف سيبدو.

سأقوم باستعادة علامة "العلاقات العامة من فضلك" ،tgriesser.

+1

+1

jimmynavio شكرا لحل

jimmynavio يعمل الحل الخاص بك بشكل جيد بالنسبة لي طالما أن الاستعلام لا يحتوي على علامة استفهام (على الرغم من أن حرف علامة الاستفهام يعمل بمفرده ، إلا أن المشكلة تحدث فقط إذا كانت مزيجًا من علامة استفهام مع أحرف أخرى).

خطأ: 126 ارتباطًا متوقعًا ، تمت مشاهدة 312 \ n عند replaceRawArrBindings (/.../node_modules/knex/lib/raw.js:99:11)\n في Raw.toSQL

في knex / lib / raw.js ، وجدت تعبيرًا عاديًا يحل محل "؟" مع الارتباطات (السطر 80 ، استبدلRawArrBindings):

raw.sql.replace(/\?\??/g, function (match) {

حاولت تغيير هذا التعبير إلى [^\\]\?\?? لكي أتمكن من الهروب من علامة الاستفهام ولكن دون نجاح (أحصل على "خطأ في بناء الجملة" لـ sql الناتج).

أي فكرة عن كيفية حل هذه المشكلة؟ أو بشكل أكثر تحديدًا ، كيف يمكنني البحث عن سلسلة تحتوي على علامة استفهام باستخدام knex.raw؟

يبدو أن كل لهجة (mysql ، postgres ، mssql ، sqlite3 ، oracle) تدعم وظيفة lower(string) لذا يبدو أنها خط أساس جيد. يمكن أيضًا تجاوز مجمعي الاستعلام لكل لهجة ، على سبيل المثال إذا أحب المرء استخدام ilike لذلك على postgres أو COLLATE NOCASE مع sqlite3.

للمقارنة الصريحة الحساسة لحالة الأحرف ... ربما يكون mysql هو db فقط والذي لا يكون دائمًا حساسًا لحالة الأحرف افتراضيًا ، لذا فإنه يحتاج إلى تطبيق خاص باللهجة ، على سبيل المثال عن طريق الطريقة esatterwhite المقترحة.

+1 من هذا المستخدم postgres

+1 مني ، سيكون ذلك رائعًا. إليك حلjimmynavio ، تم تعديله باستخدام أحرف البدل للعثور على أي شيء يحتوي على القيمة 🍡

.whereRaw("LOWER(column) LIKE '%' || LOWER(?) || '%' ", value) 

انا ايضا +1!

شيء واحد يجب أخذه في الاعتبار هنا هو أن الاستعلامات التي تستخدم LOWER(column) لن تستخدم الفهارس التي تم إنشاؤها لهذا العمود ، وبالتالي سيتم إجراء مسح كامل للجدول ، وهو أمر سيئ بشكل واضح لجميع حالات استخدام البحث.

طريقة تجنب ذلك هي إنشاء فهرس جديد على LOWER(column) ، لكن معظم الناس لن يعرفوا أو يفكروا في القيام بذلك.

لهذا السبب من المهم أن يكون لديك تجاوزات على أساس كل لهجة كما اقترح elhigu ، لتوفير إعدادات افتراضية آمنة ومعقولة لمختلف التكوينات الممكنة.

jcbize كيفية إنشاء فهرس جديد في عمليات الترحيل باستخدام LOWER (عمود)؟

أتساءل أيضًا عما إذا كانت هناك طريقة لإنشاء فهرس LOWER(column) في Postgres من ترحيل knex - أي فكرة؟

أليس هجرات knex أساسًا هل تكتب SQL فقط؟

CREATE INDEX lower_column_idx ON table(lower(column))

لست متأكدًا حقًا مما يجب فعله هنا. نظرًا لأن هذه المشكلة لا تقترح API أو تخبر بالضبط في أي الحالات يجب على المرء تطبيق حساسية الحالة هذه.

إذا كان هذا لا يزال مطلوبًا ، فالرجاء فتح مشكلة جديدة (وإحالة هذه المشكلة) ، والتي تصف فعليًا حالات الاستخدام الملموسة والاقتراح الأولي لواجهة برمجة التطبيقات كيف يجب أن تعمل الأشياء.

elhigu ، لقد ذكرت تجاوز هنا . هل يوجد المزيد من المعلومات حول هذا في مكان ما؟

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

```sql
CREATE INDEX lower_column_idx ON table(lower(column))

""

هل يمكنك مساعدتي في knex. بينما لدي عملية الانضمام وأين تحتاج الفقرة إلى التمسك بالنص المقدم مع عدم مراعاة الحالة.؟

@ vladinator1000 حلك يعمل لي ، شكرا لك :)

إذا كنت تريد إجراء بحث غير حساس ، فيمكنك استخدام ilike .
where('colume name', 'ILIKE', '%${search word}%')

هل سيتحول هذا الفاصل إلى sqlite و mysql؟

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

mtom55 picture mtom55  ·  3تعليقات

mishitpatel picture mishitpatel  ·  3تعليقات

tjwebb picture tjwebb  ·  3تعليقات

zettam picture zettam  ·  3تعليقات

saurabhghewari picture saurabhghewari  ·  3تعليقات