Frage

Ich bin mit einer MySQL-Datenbank lokal für die Entwicklung, aber die Bereitstellung von bis Heroku das Postgres verwendet. Heroku Griffe fast alles, aber meine Groß- und Kleinschreibung wie Aussagen werden Groß- und Kleinschreibung. Ich konnte iLike-Anweisungen verwenden, aber meine lokale MySQL-Datenbank, die nicht verarbeiten kann.

Was ist der beste Weg, um eine Groß- und Kleinschreibung Abfrage zu schreiben, die sowohl mit MySQL und Postgres kompatibel ist? Oder muss ich trennen mögen und iLike Erklärungen schreiben, in Abhängigkeit von der DB meiner App? Spricht

War es hilfreich?

Lösung

select * from foo where upper(bar) = upper(?);

Wenn Sie die Parameter in Großbuchstaben in dem Anrufer eingestellt ist, können Sie den zweiten Funktionsaufruf vermeiden.

Andere Tipps

Die Moral dieser Geschichte ist: Sie einen anderen Software-Stack nicht für die Entwicklung und Produktion verwenden. Niemals.

Sie müssen nur mit Fehlern am Ende, die man nicht in dev wiedergeben kann; Ihre Prüfung wird wertlos. Es einfach nicht tun.

einen anderen Datenbank-Engine ist die Frage aus - es weit mehr Fälle geben, wo es anders verhält als nur LIKE (auch, haben Sie die Sortierungen in Verwendung durch die Datenbanken geprüft Sind sie identisch in jedem Fall Wenn nicht? Sie ORDER BY auf varchar-Spalten arbeiten das gleiche vergessen können)

Verwenden Arel:

Author.where(Author.arel_table[:name].matches("%foo%"))

matches den ILIKE Operator für Postgres und LIKE für alles andere verwendet werden.

In Postgres, können Sie dies tun:

SELECT whatever FROM mytable WHERE something ILIKE 'match this';

Ich bin mir nicht sicher, ob es ein Äquivalent für MySQL ist, aber Sie können dies immer tun, was ein bisschen hässlich ist, aber sollte in beiden MySQL und Postgres arbeiten:

SELECT whatever FROM mytable WHERE UPPER(something) = UPPER('match this');

Es gibt mehrere Antworten, von denen keine sind sehr zufriedenstellend.

  • LOWER (bar) = LOWER wird Arbeit auf MySQL und Postgres, aber wahrscheinlich ausführen schrecklich auf MySQL (?): MySQL wird ihren Indizes nicht wegen der LOWER-Funktion verwenden. Auf Postgres können Sie einen Funktionsindex (auf LOWER (bar) ) hinzufügen, aber MySQL diese nicht unterstützt.
  • MySQL wird (es sei denn, Sie Groß- und Kleinschreibung Sortierungs gesetzt haben) Sie Groß- und Kleinschreibung Anpassung automatisch, und verwenden ihre Indizes. ( bar =? ).
  • aus dem Code außerhalb der Datenbank, halten bar und bar_lower Felder, wo bar_lower das Ergebnis der enthält untere (Stange) . (Dies kann möglich sein, unter Verwendung von Datenbank-Trigger, auch). (Siehe Diskussion dieser Lösung auf Drupal ). Das ist ungeschickt, aber nicht zumindest die gleiche Art und Weise läuft auf so ziemlich jede Datenbank.

REGEXP ist Groß- und Kleinschreibung (es sei denn, mit BINARY verwendet wird), und kann verwendet werden, wie so ...

    SELECT id FROM person WHERE name REGEXP 'john';

... passen 'John', 'JOHN', 'John', etc.

Wenn Sie mit PostgreSQL 8.4 können Sie die CITEXT Modul Groß- und Kleinschreibung Textfelder erstellen.

Sie könnten auch erwägen die Check-out searchlogic Plugin, das die LIKE / ILIKE Schalter für Sie.

Sie können auch verwenden ~ * in Postgres, wenn Sie einen Teil innerhalb eines Blockes übereinstimmen sollen. ~ Spiele case-sensitive Teilzeichenfolge, ~ * Groß- und Kleinschreibung String. Es ist ein langsamer Vorgang, aber ich könnte es für die Suche nützlich finden.

Select * from table where column ~* 'UnEvEn TeXt';
Select * from table where column ~ 'Uneven text';

Beide träfe auf „Some Ungleiche Text hier“ Nur die erstere auf treffen würde „zum Teil sehr unebenen Text hier“

In der oberen Converting ist am besten, da sie kompatibel Syntax für den 3 umfasst die am häufigsten verwendeten Rails Datenbank-Backends. PostgreSQL, MySQL und SQLite alle unterstützen diese Syntax. Es hat den (kleineren) Nachteil, dass Sie Ihren Suchbegriff in Ihrer Anwendung oder in Ihren Bedingungen Zeichenfolge in Großbuchstaben haben, ist es ein bisschen hässlicher zu machen, aber ich denke, die Kompatibilität Du Gewinn macht es lohnenswert.

Sowohl MySQL und SQLite3 haben einen Groß- und Kleinschreibung LIKE-Operator. Nur hat PostgreSQL Groß- und Kleinschreibung LIKE-Operator und ein PostgreSQL-spezifische (gemäß der Anleitung) ILIKE Operator für Groß- und Kleinschreibung sucht. Sie könnten ILIKE insead von LIKE in Ihren Bedingungen für die Rails-Anwendung angeben, aber bewusst sein, dass die Anwendung nicht mehr unter MySQL oder SQLite zu arbeiten.

Eine dritte Option könnte sein, die Datenbank-Engine entsprechend Sie verwenden und ändern Sie den Suchbegriff zu überprüfen. Dies könnte besser getan werden durch das Eindringen in / monkeypatching Active der Anschlussadapter und haben die PostgreSQL-Adapter die Abfrage-String zu ersetzen „LIKE“ für „ILIKE“ vor der Ausführung der Abfrage ändern. Diese Lösung ist jedoch die gewundene und im Hinblick auf einfacheren Wegen, wie beiden Begriffe großgeschrieben, ich denke, das ist die Mühe nicht worh (obwohl man es auf diese Weise viele Pluspunkte dafür bekommen würde).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top