sql >> Databasteknik >  >> RDS >> PostgreSQL

Generisk Ruby-lösning för SQLite3 LIKE eller PostgreSQL ILIKE?

roten till problemet ligger här:

Jag använder SQLite3 för utveckling och PostgreSQL för distribution.

Det är en dålig idé™. Du kommer att fortsätta stöta på inkompatibiliteter - eller ännu värre:inte inse några förrän skadan är skedd.
Använd samma RDBMS (PostgreSQL) för utveckling och produktion och spara dig själv det meningslösa besväret.

Medan du har fastnat med din olyckliga installation finns det en enkel åtgärd :

lower(style) LIKE lower(?)

Fungerar på båda plattformarna lika.

  • Du kan släppa den högra lower() , om du anger ett sökmönster med gemener.

  • I standard SQLite lower(X) viker endast ASCII-bokstäver. För mer citerar jag kapitlet Kärnfunktioner i SQLite-manualen:

    Funktionen lower(X) returnerar en kopia av sträng X med alla ASCII-tecken omvandlade till gemener. Den inbyggda standardfunktionen lower() fungerar endast för ASCII-tecken. För att göra omvandlingar av skiftlägen på icke-ASCII-tecken, ladda in ICU-tillägget .

    Betoning min.

  • PostgreSQL lower(X) fungerar med UTF-8 ur förpackningen.

Som en välkommen bieffekt kan du hastigheta upp den frågan i PostgreSQL med ett index på uttrycket lower(style) , vilket kommer att vara snabbare än att använda ILIKE och ett grundläggande index på style .

Sedan PostgreSQL 9.1 kan du också använda ett GIN- eller GIST-index med pg_trgm tillägg för att påskynda alla LIKE och ILIKE fråga - trigram är skiftlägesokänsliga. Detaljerade instruktioner och länkar i detta relaterade svar:

  • Liknande UTF-8-strängar för autoslutförandefält


  1. Automatisk indexhantering i Azure SQL Database

  2. FEL 2006 (HY000):MySQL-servern har försvunnit

  3. World Backup Day:4 intressanta dataförlustfakta att veta

  4. Distribuera databas från källkontroll