Find sin case sensitive PostgreSQL

430 views
Skip to first unread message

Obelich De Tara

unread,
Aug 21, 2009, 4:02:58 PM8/21/09
to CakePHP en Español
Hola que tal tengo rato buscando por la red pero no encuentro solucion
a este detalle tengo el codigo de mi controlador de la clase resultado
asi

function resultado()
{
if(empty($this->data))
{
$this->redirect(array('action'=>'buscar'));
}

$nombre = $this->data['Contacto']['nombre'];
$condiciones = array('Contacto.nombre ' => $nombre);
$buscars = $this->Contacto->find('all',$condiciones );
$this->set(compact('buscars'));
}

El problema data de que este es case sensitive si pones jose y hay un
Jose registrado te dice que no existe pero si le pones Jose si te da
la informacion ya le trate de muchas formas por ejemplo en los query
que yo hacia con php crudo le ponia ~* y con eso ya no diferencia
entre mayusculas y minusculas y entonces si le ponias jose como uno
queria y lo encontraba e buscado en el cookbook pero no menciona nada
del case sensitive alguien por aca que conosca una solucion de
antemano gracias

Nachopitt

unread,
Aug 21, 2009, 6:45:40 PM8/21/09
to cakep...@googlegroups.com
Esto es más bien de SQL y PHP. Tienes dos opciones: convertir, ya sea ambos datos (input del usuario y valor en la base de datos) mayúsculas o minúsculas con lowers y uppers, o la otra opción es usar un LIKE en la consulta:

....
$condiciones = array('Contacto.nombre LIKE' => $nombre);
....
--
Ignacio Alberto Zamora Esqueda
Ingeniero de Software
Corporación Tectronic, S.A. De C.V.
Tels: (33) 3615-44-11 y 36-15-45-11
Fax: (33) 3615-46-11
sist...@tectronic.com.mx
www.tectronic.com.mx

Malguzt Herzef

unread,
Aug 23, 2009, 10:55:56 AM8/23/09
to cakep...@googlegroups.com
LIKE no funciona de la misma forma en PostgreSQL que en MySQL, lo que
vos queres hacer se logra con ILIKE en PostgreSQL. Te lo comento
porque me paso lo mismo y perdí bastante tiempo investigando.
Por otra parte te diré que con ILIKE seguís sin distinguir acentos,
diéresis ni Ñs (eñes)

Ricardo Mun~oz A.

unread,
Aug 25, 2009, 9:47:07 AM8/25/09
to cakep...@googlegroups.com
2009/8/23 Malguzt Herzef <mal...@gmail.com>:

>
> LIKE no funciona de la misma forma en PostgreSQL que en MySQL,

cuales serian las diferencias?

> lo que
> vos queres hacer se logra con ILIKE en PostgreSQL. Te lo comento
> porque me paso lo mismo y perdí bastante tiempo investigando.
> Por otra parte te diré que con ILIKE seguís sin distinguir acentos,
> diéresis ni Ñs (eñes)

el asunto de los acentos, etc. se deberia solucionar al usar el mismo
encoding en el cliente y en el servidor, esto es exactamente igual
tambien en MySQL...

--
Ricardo Mun~oz A.

Malguzt Herzef

unread,
Aug 26, 2009, 5:00:32 PM8/26/09
to cakep...@googlegroups.com
No, el tema no pasa por la codificación sino por NO diferenciar
acentuadas de no acentuadas al momento de buscar. Si es que me equivo
agradeceria que me explicaran como solucionarlo porque estoy teniendo
el mismo problema ahora en MySql.

PD: La diferencia del LIKE entre bases de datos es la que especifico
mas abajo en el mensaje anterior.

Ricardo Mun~oz A.

unread,
Aug 27, 2009, 12:58:43 PM8/27/09
to cakep...@googlegroups.com
2009/8/26 Malguzt Herzef <mal...@gmail.com>:

>
> No, el tema no pasa por la codificación sino por NO diferenciar
> acentuadas de no acentuadas al momento de buscar. Si es que me equivo
> agradeceria que me explicaran como solucionarlo porque estoy teniendo
> el mismo problema ahora en MySql.

en MySQL los distintos collation sirven para indicar como tratar el
texto, si considerar o no los acentos, las mayusculas, etc. en MySQL
estan latin1_general_ci (ci = case insensitive), latin1_spanish_ci,
utf8_spanish_ci, utf8_general_ci, utf8_bin, etc.

mas info en [1] y [2]

en PostgreSQL tambien se puede/debe configurar la codificacion y
collation (ver [3]) pero ademas hay un truco donde se puede usar la
funcion to_ascii()

SELECT to_ascii('Pérez');
Perez

SELECT columna FROM table WHERE to_ascii(columna) = 'Perez';

en MySQL tambien se puede hacer el mismo truco con la funcion
replace() y ademas esta la funcion SOUNDEX() pero sirve para otra
cosa... para opciones de busqueda mas avanzadas es mejor usar indices
FULLTEXT.

> PD: La diferencia del LIKE entre bases de datos es la que especifico
> mas abajo en el mensaje anterior.

LIKE debe funcionar igual en todos los motores de base de datos que
sigan el estandar ANSI SQL. el ILIKE que mencionas es un invento
(bastante util) de PostgreSQL que no es estandar...

[1] http://dev.mysql.com/doc/refman/5.1/en/charset.html
[2] http://www.idig.za.net/mysql-character-sets-and-collation/2006/10/31/
[3] http://www.simononsoftware.com/postgresql-collation-2/

--
Ricardo Mun~oz A.

Reply all
Reply to author
Forward
0 new messages