将utf-8编码的mysqldump导入到latin1编码的数据库中。

5

我有一个包含utf8编码的phpnuke网站的备份文件。现在我想在新的服务器上重新开启这个网站,但是phpnuke使用的是latin1编码。

我需要找到一种方法,能够使用这个utf-8编码的备份文件创建一个latin1编码的数据库。

我已经尝试了各种方法,如iconv、mysql替换、php替换等等。


你手头的转储文件编码为UTF-8,所有字符在UTF-8下都能正确显示,你只是想将它们存储在一个latin1数据库中?并且这些字符都兼容latin1(即所有字符都可以编码为latin1)? - deceze
这正是我想要的,也是现实情况。 - hctopcu
1个回答

4
在您的转储开头添加SET NAMES 'utf8';语句。这将告诉MySQL即将接收的命令是UTF8编码的。它将使用当前表设置的任何字符集存储数据;在这种情况下,如果您的数据库使用latin1,则数据将以latin1存储。
http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html了解更多信息:

SET NAMES指示客户端将使用哪个字符集向服务器发送SQL语句。因此,SET NAMES 'cp1251'告诉服务器,“来自此客户端的未来传入消息采用字符集cp1251。”它还指定服务器应该用于将结果发送回客户端的字符集。(例如,如果您使用SELECT语句,则表示要使用哪个字符集用于列值。)

最后一件事是,latin1可用的字符比utf8少得多。对于除西欧语言之外的任何语言,您都会丢失数据。
例如,假设列test是latin1。第一个条目将正确显示(法语重音符号在latin1范围内),但是第二个韩文条目将显示为问号。
SET NAMES 'utf8';
INSERT INTO TESTME(test) VALUES ('Bienvenue sur Wikipédia');
INSERT INTO TESTME(test) VALUES ('한국어 위키백과에 오신 것을 환영합니다!');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接