开发者社区> 问答> 正文

将UTF8表上的latin1字符转换为UTF8?mysql

直到今天,我才意识到我的PHP脚本中缺少此功能:

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 á (á)ţăriîş "; ?> ă-ţ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'].'"'); } 它用预期的字符“更新”,除了字符串在字符“ă”之后被截断。我的意思是,字符串中不包含该字符和以下字符。

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

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

展开
收起
保持可爱mmm 2020-05-17 11:35:16 667 0
1 条回答
写回答
取消 提交回答
  • 从您的描述来看,您似乎拥有最初存储为Latin-1且随后未正确转换为UTF-8的UTF-8数据。数据是可恢复的;您将需要一个MySQL函数,例如

    convert(cast(convert(name using latin1) as binary) using utf8) 您可能需要省略内部转换,具体取决于在编码转换期间如何更改数据。来源:stack overflow

    2020-05-17 11:48:51
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
One Box: 解读事务与分析一体化数据库 HybridDB for MySQL 立即下载
One Box:解读事务与分析一体化数据库HybridDB for MySQL 立即下载
如何支撑HTAP场景-HybridDB for MySQL系统架构和技术演进 立即下载

相关镜像