将UTF-8编码的转储加载到MySQL

时间:2020-03-06 14:54:50  来源:igfitidea点击:

昨天,我已经将这个问题的答案排除在外了几个小时:

我在MySQL 4.1.22服务器上有一个数据库,其编码设置为" UTF-8 Unicode(utf8)"(由phpMyAdmin报告)。该数据库中的表的默认字符集设置为latin2. 但是,使用它的Web应用程序(用PHP编写的CMS Made Simple)在utf8中显示页面。

无论如何搞砸,它实际上都是有效的。该网络应用正确显示了字符(大多数使用捷克语和波兰语)。

我运行:" mysqldump -u xxx -p -h yyy dbname> dump.sql"。这给了我一个SQL脚本:

  • 在UTF-8中显示时,在任何编辑器(如Notepad +)中看起来都很完美-所有字符均正确显示
  • 脚本中的所有表的默认字符集均设置为latin2
  • 它具有" / *!40101 SET NAMES latin2 * /;"开头的行(在其他设置中)

现在,我想将此数据库导出到另一台在MySQL 5.0.67上运行的服务器上,并且服务器编码也设置为" UTF-8 Unicode(utf8)"。我复制了整个CMS的"简单安装",复制了dump.sql脚本,然后运行" mysql -h ddd -u zzz -p dbname <dump.sql"。之后,显示CMSMS网页时,所有字符都会被打乱。

我尝试设置:
SET character_set_client = utf8;
SET character_set_connection = latin2;

所有组合(为了安全起见,即使对我没有任何意义):latin2 / utf8,latin2 / latin2,utf8 / utf8等也无济于事。所有字符仍在混乱,但有时以不同的方式:)。

我还尝试在脚本(设置名称和表的默认字符集)中用utf8替换所有latin2设置。没有。

这里有没有MySQL专家可以用几句话来解释(毕竟我敢肯定这很简单)整个编码工作是如何工作的?我读了9.1.4. 连接字符集和排序规则,但没有任何帮助。

谢谢,
马特

解决方案

嗯...好吧,看来我找到了解决方案。

MySQL不是这里的罪魁祸首。我现在做了一个简单的转储和加载,没有对dump.sql脚本进行任何更改,这意味着我保留了"设置名称latin2"和表字符集的状态。然后,我将原来的CMSMS安装切换到了新数据库,并且...正常运行。因此,实际上在数据库中进行编码是可以的,或者至少可以与我在旧的托管服务提供商处安装的CMSMS一起正常工作(CMSMS显然可以对字符编码做一些有趣的事情)。

为了使其在新的托管服务提供商上运行,我实际上必须在CMSMS安装中将此行添加到lib / adodb / drivers / adodb-mysql.inc.php中:

mysql_query('set names latin2',$this->_connectionID);

这是这篇文章的稍作修改的解决方案。我们也可以在那里找到确切的行。因此,它看起来像mysql客户端配置问题。

我们是否尝试添加--default-character-set = name选项,如下所示:

mysql --default-character-set=utf8 -h ddd -u zzz -p dbname < dump.sql

我之前遇到过这个问题,使用该选项后它可以工作。

希望能帮助到你!