La raíz del problema se encuentra aquí:
Estoy usando SQLite3 para desarrollo y PostgreSQL para implementación.
Esa es una mala idea™. Continuará encontrando incompatibilidades, o peor aún:no se dará cuenta de algunas hasta que el daño esté hecho.
Utilice el mismo RDBMS (PostgreSQL) para el desarrollo y la producción y ahórrese los problemas sin sentido.
Si bien está atascado con su desafortunada configuración, hay una solución simple :
lower(style) LIKE lower(?)
Funciona en ambas plataformas por igual.
-
Puede soltar el
lower()
de la derecha , si proporciona un patrón de búsqueda en minúsculas. -
En SQLite estándar
lower(X)
solo dobla letras ASCII. Para más información, cito el capítulo Funciones principales en el manual de SQLite:La función lower(X) devuelve una copia de la cadena X con todos los caracteres ASCII convertidos a minúsculas. La función inferior () incorporada predeterminada funciona solo para caracteres ASCII. Para realizar conversiones de casos en caracteres que no sean ASCII, cargue la extensión ICU .
Énfasis mío.
-
PostgreSQL
lower(X)
funciona con UTF-8 listo para usar.
Como efecto secundario bienvenido, puede acelerar esa consulta en PostgreSQL con un índice en la expresión lower(style)
, que será más rápido que usar ILIKE
y un índice básico sobre style
.
Además, desde PostgreSQL 9.1 puede usar un índice GIN o GIST con el pg_trgm
extensión para acelerar any LIKE
y LIKE
consulta:los trigramas no distinguen entre mayúsculas y minúsculas. Instrucciones detalladas y enlaces en esta respuesta relacionada:
- Cadenas UTF-8 similares para el campo de autocompletar