sql >> Databáze >  >> RDS >> PostgreSQL

Obecné řešení Ruby pro SQLite3 LIKE nebo PostgreSQL ILIKE?

Kořen problému leží zde:

Používám SQLite3 pro vývoj a PostgreSQL pro nasazení.

To je špatný nápad™. Stále budete narážet na nekompatibility - nebo ještě hůř:některé si neuvědomíte, dokud nedojde k poškození.
Používejte stejné RDBMS (PostgreSQL) pro vývoj a produkci a ušetříte si zbytečné problémy.

Zatímco jste uvízli ve svém nešťastném nastavení, existuje jednoduchá oprava :

lower(style) LIKE lower(?)

Funguje na obou platformách stejně.

  • Pravé lower() můžete vypustit , pokud zadáte vyhledávací vzor s malými písmeny.

  • Ve standardním SQLite lower(X) složí pouze písmena ASCII. Pro více cituji kapitolu Core Functions v SQLite manuálu:

    Funkce Lower(X) vrací kopii řetězce X se všemi znaky ASCII převedenými na malá písmena. Výchozí vestavěná funkce lower() funguje pouze pro znaky ASCII. Chcete-li provádět převody malých a velkých písmen na znaky jiné než ASCII, načtěte rozšíření ICU .

    Zdůrazněte můj.

  • PostgreSQL lower(X) pracuje s UTF-8 ihned po vybalení.

Jako vítaný vedlejší efekt můžete zrychlit nahoru tento dotaz v PostgreSQL s indexem na výrazu lower(style) , což bude rychlejší než použití ILIKE a základní index na style .

Od PostgreSQL 9.1 můžete také použít index GIN nebo GIST s pg_trgm rozšíření pro urychlení jakéhokoli ILIKE a ILIKE dotaz - trigramy nerozlišují malá a velká písmena. Podrobné pokyny a odkazy v této související odpovědi:

  • Podobné řetězce UTF-8 pro pole automatického doplňování


  1. Jak odebrat časovou část hodnoty datetime (SQL Server)?

  2. Jaký je nejúčinnější způsob, jak oříznout čas od data a času?

  3. Stránkování pomocí MySQL LIMIT, OFFSET

  4. Neočekávaný vedlejší účinek přidání filtrovaného indexu