Comunidad Gambas-es
[SOLUCIONADO] Filtrar o ignorar en un Select los acentos de BD SQLite - Versión para impresión

+- Comunidad Gambas-es (https://gambas-es.org)
+-- Foro: Gambas (https://gambas-es.org/forum-3.html)
+--- Foro: Bases de Datos (https://gambas-es.org/forum-6.html)
+--- Tema: [SOLUCIONADO] Filtrar o ignorar en un Select los acentos de BD SQLite (/thread-852.html)



Filtrar o ignorar en un Select los acentos de BD SQLite - gambafeliz - 23-03-2022

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)


RE: Filtrar o ignorar en un Select los acentos de BD SQLite - Shordi - 23-03-2022

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


RE: Filtrar o ignorar en un Select los acentos de BD SQLite - gambafeliz - 23-03-2022

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?


RE: Filtrar o ignorar en un Select los acentos de BD SQLite - Shordi - 23-03-2022

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.


RE: Filtrar o ignorar en un Select los acentos de BD SQLite - gambafeliz - 23-03-2022

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?


RE: Filtrar o ignorar en un Select los acentos de BD SQLite - Shordi - 24-03-2022

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.


RE: Filtrar o ignorar en un Select los acentos de BD SQLite - gambafeliz - 24-03-2022

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