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 olower()
do lado direito , se você fornecer um padrão de pesquisa em letras minúsculas.
-
No SQLite padrãolower(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.
-
PostgreSQLlower(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