mysql转储中非常奇怪的字符 - 怎么办?

时间:2011-10-19 13:36:16

标签: mysql character-encoding

我有奇怪的数据破坏了我的数据迁移。这些奇怪的字符按原样嵌入到实际的mysql转储文件中:


北京东方å›悦大酒店<br />\n<br />\n“The impetus

我已经获得了带有这些字符的mysql数据转储。我将数据导入Drupal,首先重新创建mysql表,然后使用Drupal的Migrate模块查询它们。

代码如下所示:

DROP TABLE IF EXISTS `news`;
SET @saved_cs_client     = @@character_set_client;
SET character_set_client = utf8;
CREATE TABLE `news` (
  `id` int(11) NOT NULL auto_increment,
  `uid` int(11) NOT NULL,
  `pid` int(11) default NULL,
  `puid` int(11) default NULL,
  `headline` varchar(255) NOT NULL,
  `teaser` varchar(500) NOT NULL,
  `status` char(1) default NULL,
  `date` datetime NOT NULL,
  `url` varchar(255) default NULL,
  `url_title` varchar(255) default NULL,
  `body` text,
  `caption` varchar(255) default NULL,
  `gid` int(11) default NULL,
  `feature` text,
  `related` varchar(255) default NULL,
  `change1_time` int(11) default NULL,
  `change2_time` int(11) default NULL,
  `change1_user` varchar(255) default NULL,
  `change2_user` varchar(255) default NULL,
  `expires` datetime default NULL,
  `rank` char(1) default NULL,
  PRIMARY KEY  (`id`),
  KEY `uid` (`uid`),
  KEY `status` (`status`),
  KEY `expires` (`expires`),
  KEY `rank` (`rank`),
  KEY `puid` (`puid`),
  FULLTEXT KEY `headline` (`headline`,`teaser`,`body`)
) ENGINE=MyISAM AUTO_INCREMENT=6976 DEFAULT CHARSET=utf8;
SET character_set_client = @saved_cs_client;

最快的解决方案是胜利者 - 我的时间紧迫,而且在这里真的很痛苦!我尝试过搜索和替换解决方案,但似乎有太多不同类型的奇怪数据。如果我知道告诉他们什么(如何进行数据转储),我可以编排一个新的数据转储。

谢谢, 约翰

1 个答案:

答案 0 :(得分:4)

这不是您问题的直接答案,但我使用了您在帖子中引用的mojibake。看起来它原来是UTF-8编码的中文文本,在Windows-1252编码中被解释为拉丁文本,在UTF-8中被重新编码重新编码并再次被解释为Windows- 1252(当你在这里发布时,最后再次编码为UTF-8)。所以它不只是mojibake,而是 double mojibake。

此外,在某些时候,从字符串中间丢失了一个字节(可能是因为它是Windows-1252中未定义的代码点之一),从而损坏了原始字符之一。通过编码链反向运行文本(编码为Windows-1252,解码为UTF-8,重复),我得到输出:

北京东方�悦大酒店<br />\n<br />\n“The impetus

替换字符代表受损字符。