MySQL - 将UTF8表上的latin1字符转换为UTF8

时间:2012-02-23 05:44:50

标签: php mysql iso-8859-1

直到今天我才意识到我在PHP脚本中错过了这个:

mysql_set_charset('utf8');

我的所有表都是InnoDB,排序规则“utf8_unicode_ci”,我所有的VARCHAR列都是“utf8_unicode_ci”。我的PHP脚本上有mb_internal_encoding('UTF-8');,我的所有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'].'"');
}

它使用预期的字符“UPDATE”,除了字符串在字符“ă”之后被截断。我的意思是,字符串中不包含该字符和后续字符。

此外,使用“iconv()”(在代码上注释)进行测试也是如此,即使使用// IGNORE和// TRANSLIT

我还在ISO-8859-1和ISO-8859-15之间测试了几个字符集。

我真的需要帮助!谢谢。

4 个答案:

答案 0 :(得分:113)

根据您的描述,您似乎拥有最初存储为Latin-1的UTF-8数据,然后未正确转换为UTF-8。数据可以恢复;你需要像

这样的MySQL函数
convert(cast(convert(name using  latin1) as binary) using utf8)

您可能需要省略内部转换,具体取决于在编码转换期间数据的更改方式。

答案 1 :(得分:23)

我搜索了大约一两个小时的答案。我需要将旧的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版本。

答案 2 :(得分:0)

方式是更好的方式 使用连接拖曳数据库正常

然后使用此代码来制作您需要的内容 你必须使你的页面编码utf-8 by header in header cod html(别忘了这个)

然后使用此代码

ForeignKey

答案 3 :(得分:-1)

我强烈建议使用'utf8mb4'而不是'utf8',因为utf8无法存储一些汉字和表情符号。