直到今天我才意识到我在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 á (á)ţă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之间测试了几个字符集。
我真的需要帮助!谢谢。
答案 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无法存储一些汉字和表情符号。