2012-02-23 68 views
40

Sólo hoy me di cuenta de que me faltaba esto en mis scripts PHP:MySQL - Convertir caracteres latin1 en una mesa de UTF8 en UTF8

mysql_set_charset('utf8'); 

Todos mis cuadros son InnoDB, el cotejo "utf8_unicode_ci", y toda mi VARCHAR las columnas son "utf8_unicode_ci" también. Tengo mb_internal_encoding('UTF-8'); en mis scripts PHP, y todos mis archivos PHP están codificados como UTF-8.

Así que, hasta ahora, cada vez que "Insertar" algo con diacríticos, ejemplo:

mysql_query('INSERT INTO `table` SET `name`="Jáuò Iñe"'); 

El contenido 'nombre' serían, en este caso: Jáuò Iñe.

Desde que arreglé el juego de caracteres entre PHP y MySQL, ahora los INSERT nuevos se almacenan correctamente. Sin embargo, quiero arreglar todas las filas antiguas que están "en mal estado" en este momento. Intenté muchas cosas ya, pero siempre rompe las cadenas en el primer personaje "ilegal". Aquí está mi código actual:

$m = mysql_real_escape_string('¿<?php echo "¬<b>\'PHP &aacute; (á)ţăriîş </b>"; ?> ă-ţi abcdd;//;ñç´พดแทฝใจคçăâξβψδπλξξςαยนñ ;'); 
mysql_set_charset('utf8'); 
mysql_query('INSERT INTO `table` SET `name`="'.$m.'"'); 
mysql_set_charset('latin1'); 
mysql_query('INSERT INTO `table` SET `name`="'.$m.'"'); 
mysql_set_charset('utf8'); 

$result = mysql_iquery('SELECT * FROM `table`'); 
while ($row = mysql_fetch_assoc($result)) { 
    $message = $row['name']; 
    $message = mb_convert_encoding($message, 'ISO-8859-15', 'UTF-8'); 
    //$message = iconv("UTF-8", "ISO-8859-1//IGNORE", $message); 
    mysql_iquery('UPDATE `table` SET `name`="'.mysql_real_escape_string($message).'" WHERE `a1`="'.$row['a1'].'"'); 
} 

It s "Update" con los caracteres esperados, excepto que la cadena se trunca después del carácter "A". Quiero decir, ese personaje y los siguientes caracteres no están incluidos en la cadena.

Además, las pruebas con la "iconv()" (que se comenta en el código) hace lo mismo, incluso con // IGNORE y // TRANSLIT

También he probado varios juegos de caracteres, entre ISO-8859- 1 e ISO-8859-15.

Realmente necesito ayuda aquí! Gracias.

Respuesta

102

Según lo que describes, parece que tienes datos UTF-8 que originalmente se almacenaron como Latin-1 y luego no se convirtieron correctamente a UTF-8. Los datos son recuperables; que necesita una función de MySQL como

convert(cast(convert(name using latin1) as binary) using utf8) 

Es posible que usted tenga que omitir la conversión interior, dependiendo de cómo se alteró los datos durante la conversión de codificación.

+6

WOW os guarda mi día!Nunca usé esas funciones, ahora las uso en una ACTUALIZACIÓN y funcionó. ¡Muchas gracias! – Nuno

+1

¡Gracias por esto! Construí un pequeño script php que recorre todas las columnas de cada tabla. Hizo el truco :) – wiesson

+0

GRACIAS MUCHO ABS !!!!! Muchas preguntas relacionadas con SO, pero solo esta contenía la función para convertir correctamente a UTF-8 – alds

21

Después de buscar alrededor de una o dos horas para esta respuesta. Necesitaba migrar un antiguo tt_news db de un error tipográfico a una nueva versión de typo3. Ya intenté convertir el juego de caracteres en el archivo de exportación e importarlo de nuevo, pero no lo pude hacer funcionar.

Luego probé la respuesta anterior de ABS y startet una actualización en la tabla:

UPDATE tt_news SET 
    title=convert(cast(convert(title using latin1) as binary) using utf8), 
    short=convert(cast(convert(short using latin1) as binary) using utf8), 
    bodytext=convert(cast(convert(bodytext using latin1) as binary) using utf8) 
WHERE 1 

También puede convertir imagecaption, imagealttext, imagetitletext y palabras clave si es necesario. Espero que esto ayude a alguien a migrar tt_news a la nueva versión de typo3.

+1

No recibí la respuesta ABS hasta que llegue a la tuya. –

+0

De hecho, la respuesta del ABS es la "clave" de la respuesta. La respuesta de Marcel usa esa "clave" en un ejemplo completo. ¡Voten ambos! –

0

el camino es mejor manera uso de conexión de remolque que la base de datos normales

a continuación, utilizar este código para hacer lo que necesita usted debe hacer su codificación página UTF-8 por el meta en html bacalao cabecera (no se olvide de esto)

a continuación, utilizar el código

$result = mysql_query('SELECT * FROM shops'); 
    while ($row = mysql_fetch_assoc($ 
    $name= iconv("windows-1256", "UTF-8", $row['name']); 

    mysql_query("SET NAMES 'utf8'"); 
    mysql_query("update `shops` SET `name`='".$name."' where ID='$row[ID]' "); 
    } 
Cuestiones relacionadas