El enfoque más común es minúsculas o mayúsculas en la cadena de búsqueda y los datos. Pero hay dos problemas con eso.
- Funciona en inglés, pero no en todos los idiomas. (Tal vez ni siquiera en la mayoría de los idiomas). No todas las letras minúsculas tienen una letra mayúscula correspondiente; no todas las letras mayúsculas tienen una letra minúscula correspondiente.
- El uso de funciones como lower () y upper () le dará un escaneo secuencial. No puede usar índices. En mi sistema de prueba, el uso de lower () tarda aproximadamente 2000 veces más que una consulta que puede usar un índice. (Los datos de prueba tienen un poco más de 100k filas).
Existen al menos tres soluciones de uso menos frecuente que podrían ser más efectivas.
- Utilice el módulo citext , que imita principalmente el comportamiento de un tipo de datos que no distingue entre mayúsculas y minúsculas. Una vez cargado ese módulo, puede crear un índice que no distinga entre mayúsculas y minúsculas
CREATE INDEX ON groups (name::citext);
. (Pero ver más abajo).
- Use una colación que no distinga entre mayúsculas y minúsculas. Esto se establece cuando inicializa una base de datos. El uso de una intercalación que no distingue entre mayúsculas y minúsculas significa que puede aceptar casi cualquier formato del código del cliente, y aún así obtendrá resultados útiles. (También significa que no puede hacer consultas que distingan entre mayúsculas y minúsculas. Duh).
- Crea un índice funcional. Cree un índice en minúsculas usando
CREATE
INDEX ON groups (LOWER(name));
. Una vez hecho esto, puede aprovechar el índice con consultas como SELECT id FROM groups WHERE LOWER(name) = LOWER('ADMINISTRATOR');
, o SELECT id FROM groups WHERE LOWER(name) = 'administrator';
debe recordar usar LOWER (), sin embargo.
El módulo citext no proporciona un tipo de datos que no distinga entre mayúsculas y minúsculas. En cambio, se comporta como si cada cadena estuviera en minúscula. Es decir, se comporta como si hubiera llamado lower()
a cada cadena, como en el número 3 anterior. La ventaja es que los programadores no tienen que recordar cadenas en minúsculas. Pero debe leer las secciones "Comportamiento de comparación de cadenas" y "Limitaciones" en los documentos antes de decidir utilizar citext.