Knex: Groß-/Kleinschreibung bei Abfragen

Erstellt am 3. Apr. 2014  ·  28Kommentare  ·  Quelle: knex/knex

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.

PR please feature request

Hilfreichster Kommentar

+1 von mir, das wäre super. Hier ist die Problemumgehung von

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

Alle 28 Kommentare

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?

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

fsebbah picture fsebbah  ·  3Kommentare

nklhrstv picture nklhrstv  ·  3Kommentare

sandrocsimas picture sandrocsimas  ·  3Kommentare

mattgrande picture mattgrande  ·  3Kommentare

mtom55 picture mtom55  ·  3Kommentare