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

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

mysql_set_charset('utf8'); 

我所有的表都是InnoDB,sorting规则是“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现在可以正确存储了。 但是,我想修复所有现在“混乱”的旧行。 我已经尝试了很多东西,但总是打破了第一个“非法”字符的string。 这是我现在的代码:

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

它用预期的字符“更新”,不同之处在于string在“ă”之后被截断。 我的意思是,string中不包括字符和后面的字符。

此外,使用“iconv()”(即对代码进行评论)进行testing也是一样,即使使用// IGNORE和// TRANSLIT

我还testing了几个ISO-8859-1和ISO-8859-15之间的字符集。

我真的需要帮助! 谢谢。

从你所描述的,似乎你有UTF-8数据,最初被存储为拉丁-1,然后不正确地转换为UTF-8。 数据是可以回收的; 你需要一个MySQL函数

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

可能需要省略内部转换,具体取决于在编码转换过程中如何更改数据。

我search了大约一个小时或两个这个答案。 我需要将旧的tt_news数据库从input错误迁移到新的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版本。

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

然后使用这个代码,使你所需要的,你必须使你的页面编码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]' "); }