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

Nun*_*uno 43 php mysql iso-8859-1

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

mysql_set_charset('utf8');
Run Code Online (Sandbox Code Playgroud)

我的所有表都是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"');
Run Code Online (Sandbox Code Playgroud)

在这种情况下,'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'].'"');
}
Run Code Online (Sandbox Code Playgroud)

除了在字符"ă"之后字符串被截断之外,它还使用期望的字符"UPDATE".我的意思是,字符串中不包含该字符和后续字符.

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

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

我真的需要帮助!谢谢.

ABS*_*ABS 119

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

convert(cast(convert(name using  latin1) as binary) using utf8)
Run Code Online (Sandbox Code Playgroud)

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

  • 哇,你救了我的一天!我从来没有使用过现在在UPDATE上使用的那些功能而且它起作用了.非常感谢你! (7认同)
  • 谢谢你!我建立了一个小的php脚本,该脚本循环遍历每个表中的所有列。绝招:) (2认同)

Mar*_*lms 25

我搜索了大约一两个小时的答案.我需要将旧的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
Run Code Online (Sandbox Code Playgroud)

如果需要,您还可以转换imagecaption,imagealttext,imagetitletext和关键字.希望这有助于有人将tt_news迁移到新的typo3版本.

  • 直到我找到你的答案,我才得到 ABS 的答复。 (2认同)