2012-02-23 19 views
40

Dopiero dzisiaj zdałam sobie sprawę, że brakowało mi tego w moich skryptów PHP:MySQL - Konwersja znaków latin1 na stole UTF8 w UTF8

mysql_set_charset('utf8'); 

Wszystkie moje tabele są InnoDB, zestawień „utf8_unicode_ci”, a cała moja VARCHAR kolumny to także "utf8_unicode_ci". Mam mb_internal_encoding('UTF-8'); na moich skryptach PHP, a wszystkie moje pliki PHP są zakodowane jako UTF-8.

Tak, do tej pory, za każdym razem "INSERT" coś ze znakami diakrytycznymi, przykład:

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

Zawartość 'name' byłoby w tym przypadku: Jáuò Iñe.

Ponieważ poprawiłem zestaw znaków między PHP i MySQL, nowe INSERTy są teraz poprawnie zapisywane. Jednak chcę naprawić wszystkie starsze wiersze, które są "pomieszane" w tej chwili. Próbowałem już wielu rzeczy, ale zawsze łamie struny na pierwszej "nielegalnej" postaci. Tu jest mój bieżący kod:

$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 „update” sz oczekiwanych znaków, chyba że ciąg zostanie obcięty po znaku „A”. Mam na myśli, że ta postać i następujące znaki nie są zawarte w łańcuchu.

Również badania z "iconv()" (który jest skomentował kodu) robi to samo, nawet z // IGNORE i // translit

ja również testowane kilka zestawów znaków, między ISO-8859- 1 i ISO-8859-15.

Naprawdę potrzebuję pomocy tutaj! Dziękuję Ci.

Odpowiedz

102

Z tego, co opisujesz, wynika, że ​​masz dane UTF-8, które pierwotnie były zapisane jako Latin-1, a następnie nie zostały poprawnie przekonwertowane do UTF-8. Dane można odzyskać; musisz funkcję MySQL jak

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

Jest możliwe, że może trzeba pominąć wewnętrzną przemianę, w zależności od sposobu dane zostały zmienione w trakcie konwersji kodowania.

+6

WOW Uratowałeś mój dzień!Nigdy nie używałem tych funkcji, używanych teraz na AKTUALIZACJI i działało. Dziękuję Ci bardzo! – Nuno

+1

Dzięki za to! Zbudowałem mały skrypt php, który przechwytuje wszystkie kolumny w każdej tabeli. Udało się :) – wiesson

+0

DZIĘKI DUŻO ABS !!!!! Wiele powiązanych pytań SO, ale tylko ta zawierała funkcję, aby poprawnie przekonwertować do UTF-8 – alds

21

Po wyszukiwaniu tej odpowiedzi przez około godzinę lub dwie. Musiałem przenieść starą bazę danych tt_news z literówki do nowej wersji literówki3. Próbowałem już przekonwertować zestaw znaków w pliku eksportu i zaimportować go z powrotem, ale nie działało.

Potem próbowałem odpowiedź wyżej od ABS i uruchamiany aktualizację na stole:

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 

Można również konwertować imagecaption, imagealttext, imagetitletext i słów kluczowych w razie potrzeby. Mam nadzieję, że to pomoże komuś przenieść tt_news do nowej wersji literówki3.

+1

Nie otrzymałem odpowiedzi ABS, dopóki nie dotarłem do twojego. –

+0

Rzeczywiście, odpowiedź ABS jest "kluczem" do odpowiedzi. Odpowiedź Marcela używa tego "klucza" w pełnym przykładzie. Przeżyj oba! –

0

droga jest lepsza droga użycie tow ci połączenie z bazą danych normalny

następnie użyć tego kodu, aby zrobić to, co trzeba należy dokonać kodowania stronę UTF-8 przez meta w HTML nagłówka dorsza (nie zapomnij o tym)

następnie użyć tego kodu

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