当前位置: 首页 > 面试题库 >

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

邵和硕
2023-03-14
问题内容

直到今天,我才意识到我的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 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'].'"');
}

它用预期的字符“更新”,除了字符串在字符“ă”之后被截断。我的意思是,字符串中不包含该字符和以下字符。

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

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


问题答案:

从您的描述来看,您似乎拥有最初存储为Latin-1且随后未正确转换为UTF-8的UTF-8数据。数据是可恢复的;您将需要一个MySQL函数,例如

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

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



 类似资料:
  • 我继承了一个需要进一步开发的web系统。该系统似乎是由阅读了PHP教程两章的人创建的,他认为自己可以编写代码。。。 所以网页本身是UTF8格式的,显示并输入其中的所有内容。数据库表是用UTF8字符集创建的。但是,在配置中,有“SET NAMES LATIN1”。换句话说,UTF8编码的字符串用强制拉丁1编码填充到数据库中。 有没有一种方法可以将这些乱七八糟的东西转换为实际存储在utf8中并摆脱la

  • 问题内容: 我能够从发送消息到上。如果我从发送消息,则使用任何可访问性(包括完整的语言本地化)都没有区别;英语也没有问题。正确的编码很重要,只有以下代码行: 不幸的是,这是无效的。我要从中获取消息的情况有所不同。 在我得到消息的情况下,从Windows操作系统(英语,没有任何语言包),我能够把消息来自于形式。 如果Windows操作系统使用某些语言包进行了完全本地化,则我将收到一个例外 消息缓冲区

  • 问题内容: 我想解组包含JSON的a,但是该函数将a 作为输入。 如何将UTF8转换为? 问题答案: 这个问题可能是如何将字符串分配给bytes数组的重复,但是仍然有答案,因为有更好的替代解决方案: 从转换到由该规范允许的,使用一个简单的转换: 字符串类型之间的转换 […] 将字符串类型的值转换为字节片的类型会产生一个片,其连续元素是字符串的字节。 因此,您可以简单地执行以下操作: 但是,该转换会

  • 我有一个UTF8 mysql数据库,我必须导入一个latin1表。我希望导入后可以修复数据错误。是一张巨大的桌子,里面有我国所有的地址。因此数据显示如下: 我遵循一个提示说,我应该将所有TEXT字段转换为BLOB,它们将表转换为UTF8,最后将BLOB字段更改回TEXT。 以下是参考资料:https://www.percona.com/blog/2013/10/16/utf8-data-on-la

  • 我需要读入带有unicode转义的标准ascii样式字符串,并将其转换为包含utf8编码等价物的std::字符串。因此,例如“\u03a0”(包含6个字符的std::字符串)应转换为包含两个字符的std::字符串,分别为0xCE和0xA0,以原始二进制格式。 如果有一个简单的答案使用icu或boost我会很高兴,但我还没有找到一个。 (这类似于将Unicode字符串转换为转义ASCII字符串,但注

  • 问题内容: 我想使用node.js进行HTTP请求以从Web服务器加载一些文本。由于响应可能包含很多文本(有些兆字节),因此我想分别处理每个文本块。我可以使用以下代码来实现: 这似乎没有问题。但是我想支持HTTP压缩,所以我使用zlib: 这可以是像多字节字符的问题,其由两个字节组成:和。如果第一个字节被第一个块()覆盖,第二个字节被第二个块覆盖,则将在文本块的结尾/开头产生不正确的字符。如何避免