[AYUDA] Queries de caracteres acentuados en Postgres
Gustavo Guillermo Perez
gustavo en compunauta.com
Lun Abr 4 16:50:49 CDT 2011
El Lunes 04 Abril 2011, Ixcoatl Perez escribió:
> Esta opcion:
>
> CREATE OR REPLACE FUNCTION asciify(unicode text) RETURNS text AS $$
> DECLARE
> translated text;
> BEGIN
> translated := '';
> FOR i in 1..(char_length(unicode)) LOOP
> translated := translated || chr(ascii(substring(unicode,i,1))%128);
> END LOOP;
> RETURN translated;
> END;
> $$ LANGUAGE plpgsql;
>
> No es mala porque en realidad el codigo no se interpreta cada vez que
> se hace la comparacion. Cuando creas la funcion se compila y se guarda
> en codigo objeto (o posiblemente maquina), haciendo que su ejecucion
> sea tan rapida como las funciones nativas.
Si se ejecuta por cada comparación, ya que si tienes almacenado algo con
acento en una tabla y usan o no usan acentos en tu búsqueda estás forzado a
pasar la función por cada registro para sustituir los caracteres especiales
antes de comparar.
> No la haz probado?
>
> Saludos!
>
>
> El día 4 de abril de 2011 16:42, Gustavo Guillermo Perez
>
> <gustavo en compunauta.com> escribió:
> > El Lunes 04 Abril 2011, escribió:
> >> Que tal Gustavo,
> >>
> >> Nuestro problema es que usamos realmente muchos constraints en las
> >> tablas, y MySQL simplemente se arrana cual vaca en medio de la
> >> carretera con estas características.
> >>
> >> Por ejemplo, acabo de implementar la función:
> >>
> >> CREATE OR REPLACE FUNCTION sp_ascii(character varying)
> >> RETURNS text AS
> >> $BODY$
> >> SELECT TRANSLATE
> >> ($1,
> >> 'áàâãäéèêëíìïóòôõöúùûüÁÀÂÃÄÉÈÊËÍÌÏÓÒÔÕÖÚÙÛÜçÇ',
> >> 'aaaaaeeeeiiiooooouuuuAAAAAEEEEIIIOOOOOUUUUcC');
> >> $BODY$
> >> LANGUAGE 'sql' IMMUTABLE;
> >>
> >> La cual sustituye todo caracter acentuado, tanto en la cadena de búsquda
> >> como en el campo en el cual se realiza la misma. Posteriormente, creando
> >> el índice (que termina en más de 10 minutos porque la tabla tiene casi
> >> 12 millones de registros):
> >>
> >> CREATE INDEX ksp_ascii_lastname ON clients (lower(sp_ascii(lastname)));
> >>
> >> Para aventarle el query:
> >>
> >> SELECT * FROM clients WHERE lower(sp_ascii(lastname)) LIKE
> >> lower(sp_ascii('pérez'));
> >>
> >> Que me responde (en casi dos minutos):
> >>
> >> '47168 rows found'
> >>
> >> .... Esto no suena a una respuesta profesional aceptable. Pero tengo la
> >> esperanza de poder hacer un tuning a Postgres.
> >>
> >> Algun tip al respecto?. Saludos.-
> >
> > Claro que sí, es opensource, puedes modificar el código fuente en C para
> > que te transforme las comparaciones, por una función tuya que sustituya
> > la de simplemente ==, eso te daría muchísima velocidad y podrías ponerlo
> > como una opción en postgresql a la hora de construirlo y hacer público
> > el parche.!!! esa es la idea de que postgresql y mysql son opensource,
> > que puedes modificarlos.!!!!
> >
> > Respecto a los constraints, MySQL tiene varios drivers internos de
> > almacenamiento y no todos lo soportan es cierto eso no quiere decir que
> > no tenga soporte, al crear las tablas uno elije que tipo de storage,
> > sabiendo pro/cons puedes elegir entre velocidad/journaling/constraints
> > etc.
> >
> > para hacer esto te recomendaría buscar una biblioteca común de utf8 para
> > que conviertas las cadenas a utf8, luego las pases a minúsculas a ambas
> > y por último antes de hacer la comparación, reemplazar íÍïÏì por i antes
> > de ejecutar ==.
> > También deberías modificar las funciones que actualizan y modifican el
> > índice para indexar las versiones minúsculas y con los caracteres
> > convertidos, siendo que no vas a alterar el registro original, solo la
> > versión del char con el que indexas y comparas.
> >
> > Saludos.
> >
> >> > From: gustavo en compunauta.com
> >> > To: ayuda-linux en googlegroups.com
> >> > Subject: Re: [AYUDA] Queries de caracteres acentuados en Postgres
> >> > Date: Mon, 4 Apr 2011 15:50:42 -0500
> >> >
> >> > El Lunes 04 Abril 2011, escribió:
> >> > > Que tal estimadísimos,
> >> > >
> >> > > Mi duda con Postgres 8.4, es cómo diablos puedo ejecutar un select,
> >> > > donde un campo (p.e: nombre) conincida con 'maría' y me arroje los
> >> > > resultados:
> >> > >
> >> > > MARIA
> >> > > MARÍA
> >> > > maria
> >> > > maría
> >> >
> >> > tal vez con SIMILAR TO.
> >> >
> >> > > Alguien ya resolvió esto en postgres?
> >> >
> >> > Te recomiendo que si tu proyecto es nuevo lo analices, alomejor no te
> >> > conviene utilizar postgresql sino MySQL, no estoy a favor de uno o del
> >> > otro, sino que mysql en tu caso encuentra con 'maria' todos tus casos
> >> > como los listaste.
> >> >
> >> > Saludos.
> >> >
> >> > > Saludos y gracias de antemano.
> >
> > --
> > Gustavo Guillermo Perez
> > http://www.compunauta.com
> > http://www.compunauta.net
> > http://anuncios.compunauta.net
> >
> > --
> > Has recibido este mensaje porque estás suscrito a Grupo "ayuda-linux"
> > de Grupos de Google.
> > Si quieres publicar en este grupo, envía un mensaje de correo
> > electrónico a ayuda-linux en googlegroups.com
> > Para anular la suscripción a este grupo, envía un mensaje a
> > ayuda-linux-unsubscribe en googlegroups.com
> > Para obtener más opciones, visita este grupo en
> > http://groups.google.es/group/ayuda-linux?hl=es. o
> > http://www.compunauta.com/ayuda/
--
Gustavo Guillermo Perez
http://www.compunauta.com
http://www.sendadevida.org
http://anuncios.compunauta.net
--
Has recibido este mensaje porque estás suscrito a Grupo "ayuda-linux"
de Grupos de Google.
Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a ayuda-linux en googlegroups.com
Para anular la suscripción a este grupo, envía un mensaje a
ayuda-linux-unsubscribe en googlegroups.com
Para obtener más opciones, visita este grupo en
http://groups.google.es/group/ayuda-linux?hl=es. o http://www.compunauta.com/ayuda/
Más información sobre la lista de distribución Ayuda