gambafeliz   23-03-2022, 10:10
#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)
Última modificación: 27-03-2022, 13:15 por gambafeliz.
Shordi   23-03-2022, 12:14
#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
gambafeliz   23-03-2022, 13:37
#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?
Shordi   23-03-2022, 18:38
#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
gambafeliz   23-03-2022, 20:45
#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?
Última modificación: 23-03-2022, 22:36 por gambafeliz.
Shordi   24-03-2022, 08:33
#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
gambafeliz   24-03-2022, 10:32
#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
Última modificación: 26-03-2022, 19:54 por gambafeliz.
  
Usuarios navegando en este tema: 1 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.