postgresql - por - sql mayusculas y minusculas
¿Cómo hacer que mi base de datos postgresql use una intercalación que no distinga mayúsculas y minúsculas? (4)
En varias publicaciones de SO, OP solicitó una forma eficiente de buscar columnas de texto de manera no sensible al caso.
Por lo que pude entender, la manera más eficiente es tener una base de datos con una clasificación que no distinga mayúsculas y minúsculas. En mi caso, estoy creando la base de datos desde cero, por lo que tengo el control perfecto sobre la intercalación de DB. El único problema es que no tengo idea de cómo definirlo y no pude encontrar ningún ejemplo de ello.
Por favor, muéstrame cómo crear una base de datos con intercalación que no distinga mayúsculas y minúsculas.
Estoy usando postgresql 9.2.4.
EDITAR 1
La extensión CITEXT
es una buena solución. Sin embargo, tiene algunas limitaciones, como se explica en la documentación. Ciertamente lo usaré, si no existe una mejor manera.
Me gustaría enfatizar, que deseo que TODAS las operaciones de cadena no distingan entre mayúsculas y minúsculas. Usar CITEXT
para cada campo de TEXT
es una forma. Sin embargo, el uso de una clasificación insensible a mayúsculas y minúsculas sería lo mejor, si es posible.
Ahora https://stackoverflow.com/users/562459/mike-sherrill-catcall dice que PostgreSQL usa las colaciones que expone el sistema subyacente. No me importa hacer que el sistema operativo exponga una colación insensible a mayúsculas y minúsculas. El único problema que no tengo ni idea de cómo hacerlo.
Creo que necesita especificar su intercalación como una opción de línea de comando para initdb
cuando cree el clúster de base de datos. Algo como
initdb --lc-collate=en_US.UTF-8
También parece que al usar PostgreSQL 9.3 en Ubuntu y Mac OS X, initdb
crea automáticamente el clúster de la base de datos utilizando una intercalación que no distingue mayúsculas y minúsculas que es la predeterminada en la configuración regional actual del sistema operativo, en mi caso, en_US.UTF-8
.
¿Podría estar usando una versión anterior de PostgreSQL que no está predeterminada para la configuración regional del host? ¿O podría ser que estás en un sistema operativo que no proporciona ninguna intercalación que no distinga mayúsculas y minúsculas para que PostgreSQL pueda elegir?
Esto no está cambiando la intercalación, pero tal vez alguien ayude a este tipo de consulta, en la que usé la función lower
:
SELECT id, full_name, email FROM nurses WHERE(lower(full_name) LIKE ''%bar%'' OR lower(email) LIKE ''%bar%'')
No hay colaciones que no distingan entre mayúsculas y minúsculas, pero existe la extensión de citext:
Para mi propósito, la palabra clave ILIKE hizo el trabajo.
De los documentos postgres :
La palabra clave ILIKE se puede usar en lugar de LIKE para hacer que la coincidencia no distinga entre mayúsculas y minúsculas según el entorno local activo. Esto no está en el estándar SQL pero es una extensión de PostgreSQL.