2012-02-23 9 views
40

Solo oggi mi sono reso conto che mi mancava questo nei miei script PHP:MySQL - Convertire i caratteri latin1 su un tavolo UTF8 in UTF8

mysql_set_charset('utf8'); 

Tutti i miei tavoli sono InnoDB, collazione "utf8_unicode_ci", e tutta la mia VARCHAR le colonne sono anche "utf8_unicode_ci". Ho mb_internal_encoding('UTF-8'); sui miei script PHP, e tutti i miei file PHP sono codificati come UTF-8.

Così, fino ad ora, ogni volta che "Inserisci" qualcosa con segni diacritici, ad esempio:

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

Il 'nome' contenuti sarebbero, in questo caso: Jáuò Iñe.

Da quando ho risolto il set di caratteri tra PHP e MySQL, i nuovi INSERT ora vengono archiviati correttamente. Tuttavia, voglio correggere tutte le vecchie file che sono "incasinate" al momento. Ho già provato molte cose, ma rompe sempre le corde sul primo carattere "illegale". Qui è il mio codice corrente:

$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'].'"'); 
} 

E 's "Update" con i personaggi attesi, se non che la stringa viene troncata dopo il carattere "a". Voglio dire, quel personaggio e i seguenti caratteri non sono inclusi nella stringa.

Inoltre, il test con la "iconv()" (che è commentato sul codice) fa lo stesso, anche con // ignorare e // Translit

ho testato anche diversi charsets, tra ISO-8859- 1 e ISO-8859-15.

Ho davvero bisogno di aiuto qui! Grazie.

risposta

102

Da quanto descritto, sembra che i dati UTF-8 siano stati inizialmente memorizzati come Latin-1 e quindi non siano stati convertiti correttamente in UTF-8. I dati sono recuperabili; avrete bisogno di una funzione di MySQL come

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

E 'possibile che potrebbe essere necessario omettere la conversione interiore, a seconda di come i dati sono stati modificati durante la conversione di codifica.

+6

WOW Mi hai salvato la giornata!Non ho mai usato quelle funzioni, usate ora su un UPDATE e ha funzionato. Grazie mille! – Nuno

+1

Grazie per questo! Ho creato un piccolo script php che scorre in tutte le colonne di ogni tabella. Il trucco :) – wiesson

+0

GRAZIE A LOT ABS !!!!! Un sacco di domande SO correlate ma solo questa conteneva la funzione per convertire correttamente in UTF-8 – alds

21

Dopo aver cercato circa un'ora o due per questa risposta. Avevo bisogno di migrare un vecchio db tt_news da typo in una nuova versione typo3. Ho già provato a convertire il set di caratteri nel file di esportazione e importarlo di nuovo, ma non farlo funzionare.

poi ho provato la risposta di cui sopra da ABS e startet un aggiornamento sul tavolo:

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 

È possibile anche convertire imagecaption, imagealttext, imagetitletext e le parole chiave, se necessario. Spero che questo possa aiutare qualcuno a migrare da tt_news alla nuova versione di typo3.

+1

Non ho ricevuto la risposta dell'ABS fino a quando non ho raggiunto il tuo. –

+0

Infatti, la risposta dell'ABS è la "chiave" della risposta. La risposta di Marcel usa quella "chiave" in un esempio completo. Volare entrambi! –

0

il modo in cui è il modo migliore uso di connessione di traino si normale database

quindi utilizzare questo codice per fare ciò che è necessario è necessario effettuare la codifica della pagina UTF-8 da Meta nell'intestazione cod html (non dimenticate questo)

quindi utilizzare questo codice

$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]' "); 
    }