MySQL - преобразование символов латинского алфавита в таблице UTF8 в UTF8 - PullRequest
42 голосов
/ 23 февраля 2012

Только сегодня я понял, что мне не хватает этого в моих скриптах 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 &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'].'"');
}

Это «ОБНОВЛЕНИЕ» с ожидаемыми символами, за исключением того, что строка усекается после символа «ă».Я имею в виду, что этот символ и последующие символы не включены в строку.

Кроме того, тестирование с помощью "iconv ()" (который комментируется в коде) делает то же самое, даже с // IGNORE и // TRANSLIT

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

Мне действительно нужна помощь здесь!Спасибо.

Ответы [ 3 ]

113 голосов
/ 23 февраля 2012

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

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

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

23 голосов
/ 05 июня 2014

После того, как я искал примерно час или два для этого ответа.Мне нужно было перенести старую базу данных tt_news из опечатки в новую версию 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.

0 голосов
/ 24 июля 2016

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

затем используйте этот код, чтобы сделать то, что вам нужно Вы должны сделать свою страницу в кодировке 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]'  ");
    }
...