[AYUDA] Queries de caracteres acentuados en Postgres
Ixcoatl Perez
ixcoatl.perez.de.la.b en gmail.com
Lun Abr 4 16:47:25 CDT 2011
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.
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/
--
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