MySQL - преобразовать символы latin1 в таблицу UTF8 в UTF8
Только сегодня я понял, что в своих PHP-скриптах я отсутствовал:
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"');
Содержимое 'name' будет в этом случае: Jáuò Iñe
.
Так как я исправил кодировку между PHP и MySQL, новые INSERT теперь хранятся правильно. Тем не менее, я хочу исправить все старые строки, которые в настоящий момент "перепутаны". Я уже много пробовал, но он всегда разбивает строки на первый "незаконный" символ. Вот мой текущий код:
$m = mysql_real_escape_string('¿<?php echo "¬<b>\'PHP á (á)ţă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" с ожидаемыми символами, за исключением того, что строка усекается после символа "ă". Я имею в виду, что этот символ и следующие символы не включены в строку.
Кроме того, тестирование с помощью "iconv()" (которое прокомментировано кодом) делает то же самое, даже с //IGNORE и//TRANSLIT
Я также проверил несколько кодировок между ISO-8859-1 и ISO-8859-15.
Мне действительно нужна помощь здесь! Спасибо.
Ответы
Ответ 1
Из того, что вы описали, кажется, у вас есть данные UTF-8, которые были первоначально сохранены как Latin-1, а затем неправильно преобразованы в UTF-8. Данные могут быть восстановлены; вам понадобится функция MySQL, например
convert(cast(convert(name using latin1) as binary) using utf8)
Возможно, вам может потребоваться опустить внутреннее преобразование, в зависимости от того, как данные были изменены во время преобразования кодировки.
Ответ 2
После того, как я проверил около часа или два для этого ответа. Мне нужно было перенести старый 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, imagateitletext и ключевые слова, если это необходимо.
Надеюсь, это поможет кому-то перейти на tt_news на новую версию typo3.
Ответ 3
путь лучше
использовать соединение буксировка базы данных нормальный
затем используйте этот код, чтобы сделать то, что вам нужно
вы должны сделать свою страницу кодировкой utf-8 мета в заголовке cod 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]' ");
}