Es scheint, dass Knex (und damit Bookshelf) keine Möglichkeit hat, die Groß-/Kleinschreibung zu berücksichtigen, was zu inkonsistenten Ergebnissen in den verschiedenen unterstützten Datenbanken führt.
SQLite unterscheidet standardmäßig zwischen Groß- und Kleinschreibung.
MySQL hängt von der Sortierung ab, aber normalerweise wird die Groß-/Kleinschreibung nicht beachtet
PostGRES nicht sicher ??
In einem verwandten Problem in Ghost in Bezug auf Tag-Namen, bei denen die Groß-/Kleinschreibung eindeutig sein sollte, erwähnte @halfdan , dass Abfragebasis zu bestimmen:
http://edgeguides.rubyonrails.org/active_record_validations.html#uniqueness
Im Moment kann ich keine Möglichkeit finden, in allen 3 Datenbanken spezifisch Groß-/Kleinschreibung oder Groß-/Kleinschreibung zu berücksichtigen. Ich habe auch https://github.com/tgriesser/knex/issues/152 angesprochen, während ich dies zuvor in Bezug auf E-Mail-Adressen untersucht habe.
Scheint eine einigermaßen grundlegende Sache für die Arbeit mit mehreren DBs zu sein? Wie bei Bookshelf/Knex üblich, habe ich keine Ahnung, wo ich anfangen soll, dies zu beheben (siehe auch https://github.com/tgriesser/knex/issues/46#issuecomment-33230040), also wenn jemand eine Anleitung hat, würde ich helfen gerne bei der Behebung.
Bei Postgres muss die Groß-/Kleinschreibung beachtet werden. Ich verwende LOWER(field) = 'some_lower_case_value'
Es wäre schön, etwas wie ".case(boolean_value)" zu sehen.
@tgriesser Gibt es dazu ein Update?
würde sowas gerne sehen
Klingeln
Das würde ich gerne umgesetzt sehen.
Als Workaround können Sie whereRaw verwenden. Stellen Sie nur sicher, dass Sie desinfizieren!
Für die Suche nach einer Spalte ohne Berücksichtigung der Groß-/Kleinschreibung verwende ich Folgendes:
.whereRaw('LOWER(Spalte) LIKE ?', '%'+value.toLowerCase()+'%');
Bei MySQL wird die Groß-/Kleinschreibung nicht beachtet. Der Formatierer muss LIKE BINARY
und REGEXP BINARY
zulassen
@jimmynavio +1 hat mir mit deinem Workaround etwas Zeit gespart
Ich stimme zu, dass eine tragbare Vergleichsfunktion where
Berücksichtigung der Groß-/Kleinschreibung großartig wäre. Ich bin mir nicht sicher, wie es genau aussehen würde.
Ich werde das Tag "PR Please" wiederherstellen, @tgriesser.
+1
+1
@jimmynavio danke für die Lösung meines Problems
@jimmynavio Ihre Lösung funktioniert für mich
Fehler: 126 Bindings erwartet, sah 312\n bei replaceRawArrBindings (/.../node_modules/knex/lib/raw.js:99:11)\n bei Raw.toSQL
In knex/lib/raw.js habe ich einen regulären Ausdruck gefunden, der '?' mit Bindings (Zeile 80, replaceRawArrBindings):
raw.sql.replace(/\?\??/g, function (match) {
Ich habe versucht, diesen Ausdruck in [^\\]\?\??
zu ändern, um das Fragezeichen zu umgehen, aber ohne Erfolg (ich erhalte einen "Syntaxfehler" für das resultierende SQL).
Irgendeine Idee, wie man dieses Problem lösen kann? Oder genauer gesagt, wie kann ich mit knex.raw nach einer Zeichenfolge suchen, die ein Fragezeichen enthält?
Sieht so aus, als ob jeder Dialekt (mysql, postgres, mssql, sqlite3, oracle) die lower(string)
Funktion unterstützt, das klingt nach einer guten Grundlinie. Auch Abfragecompiler können für jeden Dialekt überschrieben werden, zB wenn man dafür ilike
auf postgres oder COLLATE NOCASE
mit sqlite3 verwenden möchte.
Für den expliziten Vergleich zwischen Groß- und Kleinschreibung ... wahrscheinlich ist mysql nur db, die standardmäßig nicht immer zwischen Groß- und Kleinschreibung unterscheidet, sodass eine dialektspezifische Implementierung erforderlich wäre, z. B. durch die vorgeschlagene Methode @esatterwhite .
+1 von diesem Postgres-Benutzer
+1 von mir, das wäre super. Hier ist die Problemumgehung von
.whereRaw("LOWER(column) LIKE '%' || LOWER(?) || '%' ", value)
ich auch +1!
Beachten Sie hierbei, dass Abfragen, die LOWER(column)
, keine Indizes verwenden, die für diese Spalte erstellt wurden, und daher wird ein vollständiger Tabellenscan durchgeführt, was offensichtlich für alle Suchanwendungsfälle schlecht ist.
Der Weg, dies zu vermeiden, besteht darin, einen neuen Index für LOWER(column)
zu erstellen, aber die meisten Leute werden dies nicht wissen oder daran denken.
Aus diesem Grund ist es wichtig, wie von @elhigu vorgeschlagen, Überschreibungen pro Dialekt zu haben, um sichere und sinnvolle Standardeinstellungen für verschiedene mögliche Konfigurationen bereitzustellen.
@jcbize Wie erstelle
Sie fragen sich auch, ob es eine Möglichkeit gibt, einen LOWER(column)
Index in Postgres aus einer Knex-Migration zu erstellen - irgendwelche Erkenntnisse?
Müssen Sie bei den Knex-Migrationen nicht einfach SQL schreiben?
CREATE INDEX lower_column_idx ON table(lower(column))
Ich bin mir nicht ganz sicher, was hier eigentlich gemacht werden soll. Da dieses Problem keine API vorschlägt oder genau sagt, in welchen Fällen man diese Groß-/Kleinschreibung anwenden sollte.
Wenn dies immer noch gewünscht wird, öffnen Sie bitte eine neue Ausgabe (und verweisen Sie auf diese), die konkrete Anwendungsfälle und einen ersten API-Vorschlag beschreibt, wie die Dinge funktionieren sollten.
@elhigu Sie erwähnen zwingende Abfrage - Compiler für jeden Dialekt hier . Gibt es dazu irgendwo mehr Infos?
@lehni Ich bin mir nicht sicher, wonach Sie suchen ... der Kommentar bezog sich auf interne Implementierungsdetails, wie dies in Knex erfolgen kann. Es ist nicht geeignet, dieses Problem zu umgehen. Weitere Informationen erhalten Sie, wenn Sie sich den Code der Compiler der einzelnen Dialekte ansehen.
```sql CREATE INDEX lower_column_idx ON table(lower(column))
```
kannst du mir bei knex helfen. während ich Join-Operation habe und wo Klausel muss auf den Text mit Groß-/Kleinschreibung capmare abgelegt werden.?
@vladinator1000 deine Lösung funktioniert bei mir, danke :)
Wenn Sie eine unsensible Suche durchführen möchten, können Sie ilike
.
where('colume name', 'ILIKE', '%${search word}%')
Wird die Umstellung auf sqlite und mysql kaputt gehen?
Hilfreichster Kommentar
+1 von mir, das wäre super. Hier ist die Problemumgehung von