mmm, pero con regexp, la busqueda maria quedaría convertida a:<div><br></div><div>select * from tabla where nombre similar to [mM][aAáÁäÄ][rR][iIíÍïÏ][aAáÁäÄ]</div><meta http-equiv="content-type" content="text/html; charset=utf-8"><div>
<br></div><div>lo cual haría match con:</div><div><br></div><div>María</div><div>maria</div><div>Marïa</div><div>mARIA</div><div><br></div><div>incluso podrías poner:</div><div><br></div><div><meta http-equiv="content-type" content="text/html; charset=utf-8">[mM][aAáÁäÄ4][rR][iIíÍïÏ1][aAáÁäÄ4]</div>
<div><br></div><div>y coinsidiría con:</div><div><br></div><div>M4r14</div><div><br></div><div>Por eso me encantan las expresiones regulares jejjeje.</div><div><br clear="all">Si un ave no rompe su huevo morirá antes de nacer.<br>
Nosotros somos el ave y el mundo es nuestro huevo.<br>POR LA REVOLUCIÓN DEL MUNDO!!!!<br><br>Ciudad de México<br>
<br><br><div class="gmail_quote">El 4 de abril de 2011 19:16, Mario Benitez <span dir="ltr"><<a href="mailto:mariobenitez@hotmail.com">mariobenitez@hotmail.com</a>></span> escribió:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div>
Pudiera ser, pero por ejemplo<br><br>Si la cadena de búsqueda es 'maría', y en la cual se sustituye 'í' por 'i', si tendremos de regreso los resultados:<br><br>maría<br>MARÍA<br>María<br>maria<br>
<br>... peeeero, si la cadena de búsqueda es 'maria', no habrá nada sustituíble, por lo que los resultados de la búsqueda serán:<br><br>maria<br><br>Ahora estoy probando habilitar TSearch2 en postgres. Les cuento a ver que tal.<br>
<br>Saludos.<br><br><hr>From: <a href="mailto:cxescalona@gmail.com" target="_blank">cxescalona@gmail.com</a><br>Date: Mon, 4 Apr 2011 18:29:08 -0500<div><div></div><div class="h5"><br>Subject: Re: [AYUDA] Queries de caracteres acentuados en Postgres<br>
To: <a href="mailto:ayuda-linux@googlegroups.com" target="_blank">ayuda-linux@googlegroups.com</a><br><br>oye, y no podrás usar acaso un regexp para refinar tus búsquedas??<br><br><a href="http://www.postgresql.org/docs/8.3/static/functions-matching.html" target="_blank">http://www.postgresql.org/docs/8.3/static/functions-matching.html</a><br>
<br>segun esto puedes usar la función similar to:<br><br>select * from tabla where nombre similar to maria<br><br><br>que además soporta expresiones regulares<br><br><br>si así solo no te funciona puedes por ejemplo a tu cadena de búsqueda reemplazarle cada caracter por una regla como a="[aAáÁäÁ]" m="[mM]" y así antes de integrarla a tu query, ademásde convertirla a la codificación de carácteres que estes manejando en tus tablas.<br>
<br clear="all">Si un ave no rompe su huevo morirá antes de nacer.<br>Nosotros somos el ave y el mundo es nuestro huevo.<br>POR LA REVOLUCIÓN DEL MUNDO!!!!<br><br>Ciudad de México<br>
<br><br><div>El 4 de abril de 2011 17:06, Gustavo Guillermo Perez <span dir="ltr"><<a href="mailto:gustavo@compunauta.com" target="_blank">gustavo@compunauta.com</a>></span> escribió:<br><blockquote style="padding-left:1ex">
<div>El Lunes 04 Abril 2011, Ixcoatl Perez escribió:<br>
</div><div>> Si, asi es.<br>
><br>
> Lo que queria decir es la velocidad de ejecucion por cada registro es<br>
> comprable a la de un 'like' , por decir algo. Ambos tienen que hacer<br>
> sustituciones internas de un buffer en la memoria para cada llamada a<br>
> la funcion.<br>
><br>
> Asi las cosas tu programa puede ser que no se vea afectado grandemente<br>
> por esta situacion.<br>
><br>
> De cualquier manera, si estas hablando de sacar millones de registros<br>
> de una tabla, la transposicion de unos cuantos bytes sera el menor de<br>
> tus cuellos de botella.<br>
</div>Por ello insisto que si modificas la función de postgresql que hace el índice<br>
y lo haga con los valores reemplazados mientras se insertan, y que la<br>
comparación reemplace en el núcleo de postgresql los valores de búsqueda y por<br>
registro no tendrías que llamar a una función que te aseguro que por ser un<br>
procedimiento embebido debe hacer más de 3 function calls por registro.<br>
<font color="#888888"><br>
:p<br>
</font><div><div></div><div>> Saludos<br>
><br>
> El día 4 de abril de 2011 16:50, Gustavo Guillermo Perez<br>
><br>
> <<a href="mailto:gustavo@compunauta.com" target="_blank">gustavo@compunauta.com</a>> escribió:<br>
> > El Lunes 04 Abril 2011, Ixcoatl Perez escribió:<br>
> >> Esta opcion:<br>
> >><br>
> >> CREATE OR REPLACE FUNCTION asciify(unicode text) RETURNS text AS $$<br>
> >> DECLARE<br>
> >> translated text;<br>
> >> BEGIN<br>
> >> translated := '';<br>
> >> FOR i in 1..(char_length(unicode)) LOOP<br>
> >> translated := translated ||<br>
> >> chr(ascii(substring(unicode,i,1))%128); END LOOP;<br>
> >> RETURN translated;<br>
> >> END;<br>
> >> $$ LANGUAGE plpgsql;<br>
> >><br>
> >> No es mala porque en realidad el codigo no se interpreta cada vez que<br>
> >> se hace la comparacion. Cuando creas la funcion se compila y se guarda<br>
> >> en codigo objeto (o posiblemente maquina), haciendo que su ejecucion<br>
> >> sea tan rapida como las funciones nativas.<br>
> ><br>
> > Si se ejecuta por cada comparación, ya que si tienes almacenado algo con<br>
> > acento en una tabla y usan o no usan acentos en tu búsqueda estás forzado<br>
> > a pasar la función por cada registro para sustituir los caracteres<br>
> > especiales antes de comparar.<br>
> ><br>
> >> No la haz probado?<br>
> >><br>
> >> Saludos!<br>
> >><br>
> >><br>
> >> El día 4 de abril de 2011 16:42, Gustavo Guillermo Perez<br>
> >><br>
> >> <<a href="mailto:gustavo@compunauta.com" target="_blank">gustavo@compunauta.com</a>> escribió:<br>
> >> > El Lunes 04 Abril 2011, escribió:<br>
> >> >> Que tal Gustavo,<br>
> >> >><br>
> >> >> Nuestro problema es que usamos realmente muchos constraints en las<br>
> >> >> tablas, y MySQL simplemente se arrana cual vaca en medio de la<br>
> >> >> carretera con estas características.<br>
> >> >><br>
> >> >> Por ejemplo, acabo de implementar la función:<br>
> >> >><br>
> >> >> CREATE OR REPLACE FUNCTION sp_ascii(character varying)<br>
> >> >> RETURNS text AS<br>
> >> >> $BODY$<br>
> >> >> SELECT TRANSLATE<br>
> >> >> ($1,<br>
> >> >> 'áàâãäéèêëíìïóòôõöúùûüÁÀÂÃÄÉÈÊËÍÌÏÓÒÔÕÖÚÙÛÜçÇ',<br>
> >> >> 'aaaaaeeeeiiiooooouuuuAAAAAEEEEIIIOOOOOUUUUcC');<br>
> >> >> $BODY$<br>
> >> >> LANGUAGE 'sql' IMMUTABLE;<br>
> >> >><br>
> >> >> La cual sustituye todo caracter acentuado, tanto en la cadena de<br>
> >> >> búsquda como en el campo en el cual se realiza la misma.<br>
> >> >> Posteriormente, creando el índice (que termina en más de 10 minutos<br>
> >> >> porque la tabla tiene casi 12 millones de registros):<br>
> >> >><br>
> >> >> CREATE INDEX ksp_ascii_lastname ON clients<br>
> >> >> (lower(sp_ascii(lastname)));<br>
> >> >><br>
> >> >> Para aventarle el query:<br>
> >> >><br>
> >> >> SELECT * FROM clients WHERE lower(sp_ascii(lastname)) LIKE<br>
> >> >> lower(sp_ascii('pérez'));<br>
> >> >><br>
> >> >> Que me responde (en casi dos minutos):<br>
> >> >><br>
> >> >> '47168 rows found'<br>
> >> >><br>
> >> >> .... Esto no suena a una respuesta profesional aceptable. Pero tengo<br>
> >> >> la esperanza de poder hacer un tuning a Postgres.<br>
> >> >><br>
> >> >> Algun tip al respecto?. Saludos.-<br>
> >> ><br>
> >> > Claro que sí, es opensource, puedes modificar el código fuente en C<br>
> >> > para que te transforme las comparaciones, por una función tuya que<br>
> >> > sustituya la de simplemente ==, eso te daría muchísima velocidad y<br>
> >> > podrías ponerlo como una opción en postgresql a la hora de<br>
> >> > construirlo y hacer público el parche.!!! esa es la idea de que<br>
> >> > postgresql y mysql son opensource, que puedes modificarlos.!!!!<br>
> >> ><br>
> >> > Respecto a los constraints, MySQL tiene varios drivers internos de<br>
> >> > almacenamiento y no todos lo soportan es cierto eso no quiere decir<br>
> >> > que no tenga soporte, al crear las tablas uno elije que tipo de<br>
> >> > storage, sabiendo pro/cons puedes elegir entre<br>
> >> > velocidad/journaling/constraints etc.<br>
> >> ><br>
> >> > para hacer esto te recomendaría buscar una biblioteca común de utf8<br>
> >> > para que conviertas las cadenas a utf8, luego las pases a minúsculas<br>
> >> > a ambas y por último antes de hacer la comparación, reemplazar íÍïÏì<br>
> >> > por i antes de ejecutar ==.<br>
> >> > También deberías modificar las funciones que actualizan y modifican el<br>
> >> > índice para indexar las versiones minúsculas y con los caracteres<br>
> >> > convertidos, siendo que no vas a alterar el registro original, solo la<br>
> >> > versión del char con el que indexas y comparas.<br>
> >> ><br>
> >> > Saludos.<br>
> >> ><br>
> >> >> > From: <a href="mailto:gustavo@compunauta.com" target="_blank">gustavo@compunauta.com</a><br>
> >> >> > To: <a href="mailto:ayuda-linux@googlegroups.com" target="_blank">ayuda-linux@googlegroups.com</a><br>
> >> >> > Subject: Re: [AYUDA] Queries de caracteres acentuados en Postgres<br>
> >> >> > Date: Mon, 4 Apr 2011 15:50:42 -0500<br>
> >> >> ><br>
> >> >> > El Lunes 04 Abril 2011, escribió:<br>
> >> >> > > Que tal estimadísimos,<br>
> >> >> > ><br>
> >> >> > > Mi duda con Postgres 8.4, es cómo diablos puedo ejecutar un<br>
> >> >> > > select, donde un campo (p.e: nombre) conincida con 'maría' y me<br>
> >> >> > > arroje los resultados:<br>
> >> >> > ><br>
> >> >> > > MARIA<br>
> >> >> > > MARÍA<br>
> >> >> > > maria<br>
> >> >> > > maría<br>
> >> >> ><br>
> >> >> > tal vez con SIMILAR TO.<br>
> >> >> ><br>
> >> >> > > Alguien ya resolvió esto en postgres?<br>
> >> >> ><br>
> >> >> > Te recomiendo que si tu proyecto es nuevo lo analices, alomejor no<br>
> >> >> > te conviene utilizar postgresql sino MySQL, no estoy a favor de<br>
> >> >> > uno o del otro, sino que mysql en tu caso encuentra con 'maria'<br>
> >> >> > todos tus casos como los listaste.<br>
> >> >> ><br>
> >> >> > Saludos.<br>
> >> >> ><br>
> >> >> > > Saludos y gracias de antemano.<br>
> >> ><br>
> >> > --<br>
> >> > Gustavo Guillermo Perez<br>
> >> > <a href="http://www.compunauta.com" target="_blank">http://www.compunauta.com</a><br>
> >> > <a href="http://www.compunauta.net" target="_blank">http://www.compunauta.net</a><br>
> >> > <a href="http://anuncios.compunauta.net" target="_blank">http://anuncios.compunauta.net</a><br>
> >> ><br>
> >> > --<br>
> >> > Has recibido este mensaje porque estás suscrito a Grupo "ayuda-linux"<br>
> >> > de Grupos de Google.<br>
> >> > Si quieres publicar en este grupo, envía un mensaje de correo<br>
> >> > electrónico a <a href="mailto:ayuda-linux@googlegroups.com" target="_blank">ayuda-linux@googlegroups.com</a><br>
> >> > Para anular la suscripción a este grupo, envía un mensaje a<br>
> >> > <a href="mailto:ayuda-linux-unsubscribe@googlegroups.com" target="_blank">ayuda-linux-unsubscribe@googlegroups.com</a><br>
> >> > Para obtener más opciones, visita este grupo en<br>
> >> > <a href="http://groups.google.es/group/ayuda-linux?hl=es" target="_blank">http://groups.google.es/group/ayuda-linux?hl=es</a>. o<br>
> >> > <a href="http://www.compunauta.com/ayuda/" target="_blank">http://www.compunauta.com/ayuda/</a><br>
> ><br>
> > --<br>
> > Gustavo Guillermo Perez<br>
> > <a href="http://www.compunauta.com" target="_blank">http://www.compunauta.com</a><br>
> > <a href="http://www.sendadevida.org" target="_blank">http://www.sendadevida.org</a><br>
> > <a href="http://anuncios.compunauta.net" target="_blank">http://anuncios.compunauta.net</a><br>
> ><br>
> > --<br>
> > Has recibido este mensaje porque estás suscrito a Grupo "ayuda-linux"<br>
> > de Grupos de Google.<br>
> > Si quieres publicar en este grupo, envía un mensaje de correo<br>
> > electrónico a <a href="mailto:ayuda-linux@googlegroups.com" target="_blank">ayuda-linux@googlegroups.com</a><br>
> > Para anular la suscripción a este grupo, envía un mensaje a<br>
> > <a href="mailto:ayuda-linux-unsubscribe@googlegroups.com" target="_blank">ayuda-linux-unsubscribe@googlegroups.com</a><br>
> > Para obtener más opciones, visita este grupo en<br>
> > <a href="http://groups.google.es/group/ayuda-linux?hl=es" target="_blank">http://groups.google.es/group/ayuda-linux?hl=es</a>. o<br>
> > <a href="http://www.compunauta.com/ayuda/" target="_blank">http://www.compunauta.com/ayuda/</a><br>
<br>
<br>
--<br>
Gustavo Guillermo Perez<br>
<a href="http://www.compunauta.com" target="_blank">http://www.compunauta.com</a><br>
<a href="http://www.sendadevida.org" target="_blank">http://www.sendadevida.org</a><br>
<a href="http://anuncios.compunauta.net" target="_blank">http://anuncios.compunauta.net</a><br>
<br>
--<br>
Has recibido este mensaje porque estás suscrito a Grupo "ayuda-linux"<br>
de Grupos de Google.<br>
Si quieres publicar en este grupo, envía un mensaje de correo<br>
electrónico a <a href="mailto:ayuda-linux@googlegroups.com" target="_blank">ayuda-linux@googlegroups.com</a><br>
Para anular la suscripción a este grupo, envía un mensaje a<br>
<a href="mailto:ayuda-linux-unsubscribe@googlegroups.com" target="_blank">ayuda-linux-unsubscribe@googlegroups.com</a><br>
Para obtener más opciones, visita este grupo en<br>
<a href="http://groups.google.es/group/ayuda-linux?hl=es" target="_blank">http://groups.google.es/group/ayuda-linux?hl=es</a>. o <a href="http://www.compunauta.com/ayuda/" target="_blank">http://www.compunauta.com/ayuda/</a></div>
</div></blockquote></div><br>
<br></div></div>
-- <br><div class="im">
Has recibido este mensaje porque estás suscrito a Grupo "ayuda-linux"<br>
de Grupos de Google.<br>
Si quieres publicar en este grupo, envía un mensaje de correo<br>
electrónico a <a href="mailto:ayuda-linux@googlegroups.com" target="_blank">ayuda-linux@googlegroups.com</a><br>
Para anular la suscripción a este grupo, envía un mensaje a<br>
<a href="mailto:ayuda-linux-unsubscribe@googlegroups.com" target="_blank">ayuda-linux-unsubscribe@googlegroups.com</a><br>
Para obtener más opciones, visita este grupo en<br>
<a href="http://groups.google.es/group/ayuda-linux?hl=es" target="_blank">http://groups.google.es/group/ayuda-linux?hl=es</a>. o <a href="http://www.compunauta.com/ayuda/" target="_blank">http://www.compunauta.com/ayuda/</a> </div>
</div><div><div></div><div class="h5">
<p></p>
-- <br>
Has recibido este mensaje porque estás suscrito a Grupo "ayuda-linux"<br>
de Grupos de Google.<br>
Si quieres publicar en este grupo, envía un mensaje de correo<br>
electrónico a <a href="mailto:ayuda-linux@googlegroups.com" target="_blank">ayuda-linux@googlegroups.com</a><br>
Para anular la suscripción a este grupo, envía un mensaje a<br>
<a href="mailto:ayuda-linux-unsubscribe@googlegroups.com" target="_blank">ayuda-linux-unsubscribe@googlegroups.com</a><br>
Para obtener más opciones, visita este grupo en<br>
<a href="http://groups.google.es/group/ayuda-linux?hl=es" target="_blank">http://groups.google.es/group/ayuda-linux?hl=es</a>. o <a href="http://www.compunauta.com/ayuda/" target="_blank">http://www.compunauta.com/ayuda/</a></div>
</div></blockquote></div><br></div>
<p></p>
-- <br />
Has recibido este mensaje porque estás suscrito a Grupo "ayuda-linux"<br />
de Grupos de Google.<br />
Si quieres publicar en este grupo, envía un mensaje de correo<br />
electrónico a ayuda-linux@googlegroups.com<br />
Para anular la suscripción a este grupo, envía un mensaje a<br />
ayuda-linux-unsubscribe@googlegroups.com<br />
Para obtener más opciones, visita este grupo en<br />
<a href="http://groups.google.es/group/ayuda-linux?hl=es">http://groups.google.es/group/ayuda-linux?hl=es</a>. o <a href="http://www.compunauta.com/ayuda/">http://www.compunauta.com/ayuda/</a>