PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Solução genérica Ruby para SQLite3 LIKE ou PostgreSQL ILIKE?


A raiz do problema fica aqui:

Estou usando SQLite3 para desenvolvimento e PostgreSQL para implantação.

Essa é uma má ideia™. Você continuará se deparando com incompatibilidades - ou pior:não perceberá algumas até que o dano seja feito.
Use o mesmo RDBMS (PostgreSQL) para desenvolvimento e produção e economize problemas inúteis.

Enquanto você está preso com sua configuração infeliz, há uma correção simples :
lower(style) LIKE lower(?)

Funciona em ambas as plataformas igualmente.

  • Você pode soltar o lower() do lado direito , se você fornecer um padrão de pesquisa em letras minúsculas.

  • No SQLite padrão lower(X) apenas dobra letras ASCII. Para mais, cito o capítulo Core Functions no manual do SQLite:

    A função lower(X) retorna uma cópia da string X com todos os caracteres ASCII convertidos em letras minúsculas. A função lower() padrão integrada funciona apenas para caracteres ASCII. Para fazer conversões de maiúsculas e minúsculas em caracteres não ASCII, carregue a extensão ICU .

    Destaque meu.

  • PostgreSQL lower(X) funciona com UTF-8 fora da caixa.



Como efeito colateral bem-vindo, você pode acelerar essa consulta no PostgreSQL com um índice na expressão lower(style) , que será mais rápido do que usar ILIKE e um índice básico em style .

Além disso, desde o PostgreSQL 9.1 você pode usar um índice GIN ou GIST com o pg_trgm extensão para acelerar qualquer LIKE e ILIKE query - os trigramas não diferenciam maiúsculas de minúsculas. Instruções detalhadas e links nesta resposta relacionada:
  • Strings UTF-8 semelhantes para campo de preenchimento automático