Este foro usa cookies
Este foro utiliza cookies para almacenar su información de inicio de sesión si está registrado y su última visita si no lo está. Las cookies son pequeños documentos de texto almacenados en su computadora; las cookies establecidas por este foro solo se pueden usar en este sitio web y no representan ningún riesgo de seguridad. Las cookies en este foro también rastrean los temas específicos que ha leído y la última vez que los leyó. Si Ud. continúa navegando, entenderemos que acepta todas las cookies.

Se almacenará una cookie en su navegador, independientemente de la elección, para evitar que se le vuelva a hacer esta pregunta. Podrá cambiar la configuración de sus cookies en cualquier momento utilizando el enlace en el pie de página.

El foro antiguo se encuentra accesible desde https://foro.gambas-es.org en modo de solo lectura.

Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5

[SOLUCIONADO]  Filtrar o ignorar en un Select los acentos de BD SQLite
#1

Hola

Me preguntaba como ustedes resuelven la obtención de datos de una columna Nombre donde deseas obtener todos los resultados tengan tilde (acento) o no.

Ejemplo, tengo el siguiente nombre: Clínica y deseo obtener tanto Clinica como Clínica, como montan su Select

Gracias.

==== Solucionado =============================================
Mi solución la describo abajo:
1. La palabra a buscar por el usuario: "Clinica" la paso a una función para sustituir las vocales por "_", quedaría así, "Cl_n_c_" y esta se la paso al Select a SQLite
2. Como dice Shordi, SQLite devuelve a un Result, todas las opciones posible que entren en "Cl_n_c_", este Result y la palabra original del usuario, la paso a una función para comparar y así ignorar las tildes y obtenemos la columna (ID) con las filas coincidentes a la palabra a buscar. Una vez identificadas las IDs las devuelvo en forma de Array.
3. Ahora tenemos un Array con los IDs completamente identificados. Ahora solo falta solicitar estos IDs a la base de datos y así tenemos todos los registros absolutamente correctos. (Clinica y Clínica, osea, todos los que quiere el usuario)
    ¡Gracias!
#2

En la base de datos puedes establecer el encoding a utf8 con
Código:
PRAGMA encoding="UTF-8";
y si eso no funciona correctamente por sí solo añadir en los results de gambas el uso de la clase string, que maneja utf8.
De todas formas si la base de datos está mal formado o la carga de datos tiene los encodes mezclados no se garantiza que te vaya a ser fácil... según dicen.

Saludos

No podemos regresar
    ¡Gracias!
#3

Gracias Shordi

Te cuento:
En la base de datos he puesto:
.dbinfo

Y en un apartado dice:
text encoding: 1 (utf8)

Perdón por mi ignorancia sobre SQLite, ¿es esto lo que me estas diciendo?, ¿entiendo que esta bien como lo tengo?
    ¡Gracias!
#4

Supongo. Si los datos son coherentes tu única opción es o preguntar por las dos cadenas (con y sin acentos) o utilizar el LIKE en el select.

Saludos.

No podemos regresar
    ¡Gracias!
#5

Acabo de probar lo siguiente, te cuento; si hacemos el ejemplo de Clínica... lo que he hecho es crear una subrutina donde le paso la palabra de paso previa al enter de la busqueda, en esta subrutina sustituyo Clínica x Cl_n_c_ de esta manera like me da ambas situaciones, osea, Clínica y Clinica.

Creo que esta es una buena opción. ¿Como la ves?
    ¡Gracias!
#6

Bueno... eso te filtra clínica, clinica, clónico , clonico, clónica y clonica... como mínimo. Es difícil normalizar la salida de datos si no se normaliza la entrada y no se sabe bien qué se busca.

No podemos regresar
    ¡Gracias!
#7

Tienes razón esta mañana lo pensé Smile

Pero seguí pensando en el mismo sentido. Y después de obtener lo que tu has dicho, pasamos este result a otra función para crear un array con las palabras que coincidan con la solicitud del usuario, determinando tan solo la tilde. Un ejemplo, el usuario busca, Clinica, pero en la base de datos solo existe Clínica, yo por ejemplo paso Cl_n_c_ y me devuelve tus palabras en un result, yo lo envío a una función el result y la palabra enviada a la bd y mi función se encarga de obtener solo los caracteres coincidentes y los devuelve en un array y este es el que verá el usuario.

Parece que esto se acercaría mas. No crees?

Por otra parte he visto estos enlaces en el Manual de SQLite (sobre latin y remove_diacritics=2) pero sinceramente soy incapaz por ahora de interpretarlo adecuadamente y no se crear lo que me explica, estos son los enlaces:

https://www.sqlite.org/fts3.html
https://www.sqlite.org/fts5.html

Saludos
    ¡Gracias!


Posibles temas similares…
Tema / Autor Respuestas Vistas Último mensaje
Último mensaje por omoreno
11-03-2022, 16:17
Último mensaje por Shordi
18-09-2021, 18:10
Último mensaje por Shell
18-09-2021, 14:41

Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)