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

只有今天我意识到,我错过了这在我的PHP scritps:

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"');

“名称”内容将是,在这种情况下: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 `acid_test` SET `realname`="'.$m.'"');
mysql_set_charset('latin1');
mysql_query('INSERT INTO `acid_test` SET `realname`="'.$m.'"');
mysql_set_charset('utf8');

$result = mysql_iquery('SELECT * FROM `acid_test`');
while ($row = mysql_fetch_assoc($result)) {
    $message = $row['realname'];
    $message = mb_convert_encoding($message, 'ISO-8859-15', 'UTF-8');
    //$message = iconv("UTF-8", "ISO-8859-1//IGNORE", $message);
    mysql_iquery('UPDATE `acid_test` SET `realname`="'.mysql_real_escape_string($message).'" WHERE `a1`="'.$row['a1'].'"');
}

它与期望的字符“UPDATE”,除了字符串在字符“ă”之后被截断。我的意思是,字符和后面的字符不包括在字符串。

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

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

我真的需要帮助!谢谢。

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

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

有可能您可能需要省略内部转换,这取决于在编码转换期间数据如何更改。

http://stackoverflow.com/questions/9407834/mysql-convert-latin1-characters-on-a-utf8-table-into-utf8

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:php – MySQL – 将UTF8表上的latin1字符转换为UTF8