Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

busqueda con like

Estas en el tema de busqueda con like en el foro de Mysql en Foros del Web. Hola a todos, Tengo un pequeño problema a ver si me podéis hechar una mano. Tenemos una tabla innodb con codificación utf-8 en la cual ...
  #1 (permalink)  
Antiguo 18/05/2009, 08:49
 
Fecha de Ingreso: noviembre-2005
Mensajes: 182
Antigüedad: 18 años, 5 meses
Puntos: 4
busqueda con like

Hola a todos,

Tengo un pequeño problema a ver si me podéis hechar una mano.

Tenemos una tabla innodb con codificación utf-8 en la cual realizamos una búsqueda con like sobre un campo título, la consulta like sería:

Código:
titulo LIKE '%texto_a_buscar%'
Esto funciona bien salvo que está diferenciando las tildes, por lo que si el texto a buscar no lleva tilde y la palabra si la tiene en la base de datos, no saca ese resultado.

Utilizando phpmyadmin, hemos realizado la misma consulta para ver que instrucción utilizaba y a utilizado la siguiente y funcionando correctamente presentando el resultado tenga o no tenga tilde:

Código:
titulo LIKE CONVERT(_utf8 '%texto_a_buscar%' USING latin1) COLLATE latin1_swedish_ci
Hemos cogido dicha instrución y la hemos incluido en nuestro código y no funciona, nuestras páginas tienen codificación iso-8859 no sé si tendrá que ver.

Sabéis porque ocurre esto? que debo hacer para que funcione?

Muchas gracias
  #2 (permalink)  
Antiguo 18/05/2009, 11:06
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: busqueda con like

Si usas una tabla con codificación utf8 y una collation utf8_spanisch_ci, cambia a codificación utf8 la codificación del archivo en los que cargas la palabra buscada (me refiero al archivo del formulario). No compensa hacer un convert a latin1 y una collation a latin1_swedisch_ci si usas en la base utf8. Mejor cambiar el documento que te está cambiando a latin1, el del formulario.
  #3 (permalink)  
Antiguo 19/05/2009, 21:34
 
Fecha de Ingreso: noviembre-2005
Mensajes: 182
Antigüedad: 18 años, 5 meses
Puntos: 4
Respuesta: busqueda con like

Hola Jurena,

Perdona no haberte respondido antes pero no he visto el correo de aviso.

Estoy desesperado, no se que hacer, he hecho lo que me comentas, poner el archivo donde se encuentra el formulario en utf-8, el que lo recibe también y todas las combinaciones posibles, nada, sigue distinguiendo las tildes.

Con lo sencillo que parece que lo hace phpmyadmin, pues no hay manera ni siquiera poniendo la mima instrucción.

No se te ocurre que otra cosa pueda ser.

Muchas gracias.
  #4 (permalink)  
Antiguo 20/05/2009, 08:12
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: busqueda con like

Mira este enlace;
http://www.forosdelweb.com/f86/cotej...spanol-629105/
comprueba todo y no olvides el set names...
  #5 (permalink)  
Antiguo 20/05/2009, 08:33
 
Fecha de Ingreso: noviembre-2005
Mensajes: 182
Antigüedad: 18 años, 5 meses
Puntos: 4
Respuesta: busqueda con like

Hola Jurena,

He hecho lo que me comentas, lo único que no estaba era lo del set names pero al ponerlo sigue sin lanzar los resultados sin tener en cuenta las tildes.

Algo se escapa y no damos con ello.

No se si es importante, en la tabla las tildes no aparecen normales sino como símbolos.

Muchas gracias
  #6 (permalink)  
Antiguo 20/05/2009, 12:00
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: busqueda con like

a ver si nos estamos perdiendo. ¿Tu problema es que si buscas con acento algo que no tiene acento no te lo encuentra?
es decir:
Cita:
Esto funciona bien salvo que está diferenciando las tildes, por lo que si el texto a buscar no lleva tilde y la palabra si la tiene en la base de datos, no saca ese resultado.
Eso se debe a que estás usando una collation o cotejamiento que no es del tipo ci, es decir, si quieres que te lo encuentre debes usar una collation para el campo sobre el que busques del tipo utf8_spanish_ci, por decirte una si buscas palabras en español. Si tu codificación o charset es utf8, asigna esta collation al campo sobre el que buscas y vuelve a probar.
Dinos qué tal te fue.
Piensa que lo que he puesto en el hilo que te recomendé sigue siendo necesario si el charset o codificación es utf8.
  #7 (permalink)  
Antiguo 20/05/2009, 13:19
 
Fecha de Ingreso: noviembre-2005
Mensajes: 182
Antigüedad: 18 años, 5 meses
Puntos: 4
Respuesta: busqueda con like

A ver si conseguimos dar con el problema.

Lo que quiero es que si alguien pone en el buscador por ejemplo "camion" le ofrezca los resultados que contengan "camion" y "camión", ahora sólo de vuelve los resultados que contienen "camion" sin tilde, y viceversa si incluyes la tilde en la búsqueda.

A ver si va a ser un problema con los campos de la tabla, te pongo como está:

Tabla:
Charset: utf8
Collation: utf8_spanish_ci


Campo titulo donde se realiza la búsqueda:
Charset: latin1
Collation: latin1_swedish_ci


Debo cambiar el charset del campo a utf8 también? Hay algún problema con los datos si realizo este cambio?

Un saludo
  #8 (permalink)  
Antiguo 20/05/2009, 15:47
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: busqueda con like

¿Cómo tienes codificada la base, imagino que con utf8? Si es así, haz una copia de la tabla de datos y estructura y haz la prueba cambiando la collation del campo titulo utf8_spanish_ci; no creo que pase nada, y no estarás actuando sobre la tabla original. Si ves que todo te queda igual puedes cambiar tu tabla original y hacer la búsqueda.
  #9 (permalink)  
Antiguo 20/05/2009, 20:06
 
Fecha de Ingreso: noviembre-2005
Mensajes: 182
Antigüedad: 18 años, 5 meses
Puntos: 4
Respuesta: busqueda con like

Hola de nuevo,

He cambiado el campo a utf8 y collation utf8_spanish_ci y no funciona, tengo una réplica de la tabla en latin1 y si realizo la búsqueda ahi, funciona correctamente pero luego me saca símbolos extraños en la página, no sé que es peor.

¿Cómo veo la codificación de la base de datos?

No tendrá que ver la forma en la que se guardan los datos no? Si visualizo directemente la tabla con phpmyadmin por ejemplo, "prisión" lo veo como "Prisión"

Esto es desesperante, ya he probado de todo.

Muchas gracias y perdona mi pesadez.
  #10 (permalink)  
Antiguo 21/05/2009, 01:04
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: busqueda con like

Empecemos de nuevo:
escribe esto en consola o en el PHPMyAdmin

SHOW CREATE DATABASE nombredetubase

y verás el charset y la collation

y para la tabla
SHOW CREATE TABLE nombredetutabla
  #11 (permalink)  
Antiguo 21/05/2009, 12:53
 
Fecha de Ingreso: noviembre-2005
Mensajes: 182
Antigüedad: 18 años, 5 meses
Puntos: 4
Respuesta: busqueda con like

Hola jurena,

La base de datos tiene un charset "Latin1" y un collation "latin1_swedish_ci"

La tabla y el campo donde se realiza la búsqueda tiene un charset "utf8" y un collation "utf8_spanish_ci"

Cómo lo ves?
  #12 (permalink)  
Antiguo 21/05/2009, 13:37
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: busqueda con like

pues cambia la collation de la base a latin1_spanish_ci, y el charset de la tabla y el campo a latin1 y la collation a latin1_spanish_ci.
Luego reajusta todo lo demás: deja la codificación de los archivos html y php donde cargas los datos en ANSI, cambia los meta y deja siempre ISO-8859-1, donde sea necesario
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1">

quita ese set names utf-8, ya no lo necesitarás, y en todo caso tendrás que aplicar el de ISO-8859-1, si no lo tienes por defecto.
Creo que empezarás a ver algo de luz.
  #13 (permalink)  
Antiguo 21/05/2009, 20:29
 
Fecha de Ingreso: noviembre-2005
Mensajes: 182
Antigüedad: 18 años, 5 meses
Puntos: 4
Respuesta: busqueda con like

Hola Jurena,

Estoy a punto de tirarme por la ventana, te cuento lo que he hecho.

He replicado el sitio y la base de datos en un servidor local, he cambiado la codificación y el collation de la tabla y el campo en cuestión a iso y nada, sigue direnciando las tildes, buscas con tilde y saca todo lo que lleva tilde pero no lo que no la lleva y viceversa, he probado a hacer las búsquedas con mysql query y lo mismo.

Quién me mandaría meterme con el utf8.

Otra cosa que me viene a la mente, el campo título que es en el que se realiza la búsqueda está indexado, no creo que tenga nada que ver, no? probé a quitar el índice y tampoco iba.
  #14 (permalink)  
Antiguo 21/05/2009, 23:33
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: busqueda con like

el cotejamiento del campo titulo donde buscas es muy importante, en este caso lo importante: debe ser latin1_spanish_ci
El problema no es haberte metido en utf8, sino haber mezclado charset y collation de bases, tablas y campos sin saber exactamente qué estabas haciendo, al menos en alguna parte.
Vayamos al principio del todo, para que veas lo que está sucediendo. Ah, y no te acerques a la ventana.
Escribe esto en el PHPMyAdmin que uses en localhost


Código SQL:
Ver original
  1. CREATE TABLE `tabla` (
  2.   `titulo` VARCHAR(50) COLLATE utf8_spanish_ci NOT NULL
  3. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;
  4.  
  5. --
  6. -- Volcar la base de datos para la tabla `tabla`
  7. --
  8.  
  9. INSERT INTO `tabla` (`titulo`) VALUES
  10. ('camión'),
  11. ('camion'),
  12. ('camíon'),
  13. ('cámion');

Ahora con esa pequeña base creada, base cuya codificación es utf8 y su collation utf8_spanish_ci,
lanza la siguiente consulta
SELECT titulo FROM tabla WHERE titulo LIKE 'camion'

Luego nos dices qué ocurre.

Si cambias el cotejamiento del campo titulo a por ejemplo utf8_bin (lo puedes hacer con esto:
ALTER TABLE `tabla` CHANGE `titulo` `titulo` VARCHAR( 50 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL), verás lo que ocurre si haces la misma consulta.

Si todo ha funcionado bien, deberías comprender la importancia de la collation del campo para lo que quieres hacer.

Última edición por jurena; 22/05/2009 a las 00:48
  #15 (permalink)  
Antiguo 22/05/2009, 19:32
 
Fecha de Ingreso: noviembre-2005
Mensajes: 182
Antigüedad: 18 años, 5 meses
Puntos: 4
Respuesta: busqueda con like

Hola Jurena,

Parece que se empieza a ver algo de luz al final del tunel.

Hice la prueba que me digiste y funcionaba correctamente, me dispuse a crear una nueva tabla de cero y volcar todos los datos de la antigua a la nueva y para mi sorpresa aquello seguía igual.

No lo podía entender, así que pense en modificar a mano algunos títulos cambiando los símbolos que aparecían en lugar de las tildes por por la letra normal con tilde, entonces al realizar una búsqueda por "mexico" por ejemplo, sacaba tanto "méxico" como "mexico" lo cual hace pensar que el problema está en los símbolos?

Introduje nuevas filas utilizando utf8_decode previamente y se grababa el título con el texto tal y como lo escribimos y al realizar búsquedas sin tilde presentaba las palabras, con tilde y sin ella, no así si se realizaba una búsqueda con tilde donde no sacaba nada.

Esto último no me causa un gran problema ya que antes de realizar un búsqueda puedo quitarle la tilde, pero resulta curioso.

Según esto me tocaría cambiar todos los símbolos por caracteres normales y volverlo a grabar, como lo ves?

Un saludo
  #16 (permalink)  
Antiguo 23/05/2009, 00:11
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: busqueda con like

Chelsea,
lo primero es que nos digas en qué codificación y con qué collation creaste la nueva base. Luego cómo hiciste el paso, pues piensa que no sé exactamente lo que tienes en la vieja. Convendría saberlo exactamente, es decir, saber qué codificación tienen.
Cita:
La base de datos tiene un charset "Latin1" y un collation "latin1_swedish_ci"

La tabla y el campo donde se realiza la búsqueda tiene un charset "utf8" y un collation "utf8_spanish_ci"

Si es esto, quizás deberías primero cambiar el charset y collation de esos campos y tablas a Latin1 y la collation a latin1_spanish_ci.
Mira luego a ver qué ves en la tabla. Si siguen los signos mal, vuelve a poner la codificación que tenías.

Luego intentaría crear un campo con la codificación latin1 y haría un update de ese campo titulo así;
update nombretabla SET nuevocampo = CONVERT(titulo USING latin1)

y vería qué me muestra ese nuevo campo.

Se trata de tener una codificación que muestre bien los caracteres, para poder luego cambiar.

Mira lo que recomienda el manual para convertir pasar datos de una tabla codificada en latin1 a otra en utf8.

INSERT INTO utf8table (utf8column)
SELECT CONVERT(latin1field USING utf8) FROM latin1table;

Pero haz siempre las pruebas en copias y tras haber asegurado la información.

Ahora lo que cuenta es que entiendas que no puedes estar mezclando charset, porque los datos se almacenan de distinto modo. Decídete por uno, utf8 o latin1, y empieza a actuar. Yo uso utf8, porque creo que es el presente-futuro.

Última edición por jurena; 23/05/2009 a las 00:20
  #17 (permalink)  
Antiguo 23/05/2009, 01:51
 
Fecha de Ingreso: noviembre-2005
Mensajes: 182
Antigüedad: 18 años, 5 meses
Puntos: 4
Respuesta: busqueda con like

Estoy de acuerdo contigo, el utf8 creo será lo que se imponga por defecto, por eso quise meterme con él, voy a hacer lo que me comentas en tablas de prueba, no me gustaría perder las 117000 filas que tengo ahora mismo.

Te voy contando los resultados.

Un saludo
  #18 (permalink)  
Antiguo 24/05/2009, 02:57
 
Fecha de Ingreso: noviembre-2005
Mensajes: 182
Antigüedad: 18 años, 5 meses
Puntos: 4
De acuerdo Respuesta: busqueda con like

Bueno Jurena, parece que ya lo hemos arreglado.

Por lo visto el problema venía en la forma en la que se grababan los datos en la tabla, el volcado toda la tabla convirtiendo los símbolos en caracteres normales con tilde y ahora funciona perfectamente.

Muchas gracias por tu ayuda y paciencia, sin ella no se que habría hecho, para cualquier cosa ya sabes donde me tienes.

Un saludo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:54.