2012-02-23 2 views
40

Только сегодня я понял, что мне не хватает этого в моих PHP скриптов:MySQL - Преобразование latin1 символов на столе UTF8 в UTF8

mysql_set_charset('utf8'); 

Все мои таблицы InnoDB, сверка «utf8_unicode_ci», и все мои VARCHAR столбцы - «utf8_unicode_ci». У меня есть mb_internal_encoding('UTF-8'); на моих PHP-скриптах, и все мои PHP-файлы закодированы как UTF-8.

Таким образом, до сих пор, каждый раз, когда я «не ВСТАВИТЬ» что-то с диакритическими знаками, например:

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

«Имя» содержимое будет, в этом случае: Jáuò Iñe.

Поскольку я исправил кодировку между PHP и MySQL, новые INSERT теперь хранятся правильно. Тем не менее, я хочу исправить все старые строки, которые в настоящий момент «перепутаны». Я уже много пробовал, но он всегда разбивает строки на первый «незаконный» символ. Вот мой текущий код:

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

Это «UPDATE» s с ожидаемыми символами, за исключением того, что строка получает усечена после символа «A». Я имею в виду, что этот символ и следующие символы не включены в строку.

Кроме того, тестирование с «Iconv()» (который комментировал код) делает то же самое, даже с // ИГНОРИРУЙТЕ и // TRANSLIT

Я также протестировали несколько кодировок, между ISO-8859- 1 и ISO-8859-15.

Мне очень нужна помощь здесь! Спасибо.

ответ

102

Из того, что вы описали, кажется, у вас есть данные UTF-8, которые были первоначально сохранены как Latin-1, а затем неправильно преобразованы в UTF-8. Данные могут быть восстановлены; вам нужна функция MySQL, как

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

Вполне возможно, что вам может понадобиться, чтобы опустить внутреннюю конверсию, в зависимости от того, как данные были изменены в процессе преобразования кодирования.

+6

WOW вы сохранили мой день!Я никогда не использовал эти функции, которые теперь используются в UPDATE, и это сработало. Большое спасибо! – Nuno

+1

Спасибо за это! Я создал небольшой скрипт php, который перебирает все столбцы в каждой таблице. Сделал трюк :) – wiesson

+0

СПАСИБО БОЛЬШОЙ АБС !!!!! Много связанных вопросов SO, но только в этом есть функция для правильной конвертации в UTF-8 – alds

21

После того, как я искал около часа или двух для ответа. Мне нужно было перенести старый tt_news db из опечатки в новую версию typo3. Я уже попробовал преобразовать кодировку в файл экспорта и импортировать ее обратно, но не получил ее работу.

Тогда я попробовал ответ выше из ABS и запущена при обновлении на столе:

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 

Вы также можете конвертировать imagecaption, imagealttext, imagetitletext и ключевые слова, если это необходимо. Надеюсь, это поможет кому-то перейти на tt_news на новую версию typo3.

+1

Я не получил ответа ABS, пока не достиг твоего. –

+0

Действительно, ответ ABS - это «ключ» к ответу. Ответ Марселя использует этот «ключ» в полном примере. Поднимите оба! –

0

путем является лучшим способом использовать соединение буксировать вас базу данных нормально

затем использовать этот код, чтобы сделать то, что вам нужно вы должны сделать вашу страницу Кодировки UTF-8 с помощью меты в заголовке треск HTML (не забудьте это)

затем использовать этот код

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