将MySQL数据库从Latin转换为UTF-8

27

我正在将一个网站从ISO转换为UTF-8,因此我需要同时转换MySQL数据库。

在互联网上,我看到了各种各样的解决方案,但我不知道应该选择哪一个。

我真的需要将我的varchar列先转换成二进制,然后再转换成UTF-8吗?

ALTER TABLE t MODIFY col BINARY(150);
ALTER TABLE t MODIFY col CHAR(150) CHARACTER SET utf8;

对于每个数据库的每个表的每个列,这需要很长时间来完成。

我有10个数据库,每个数据库有20个表,每个表有大约2-3个varchar列(每个列2个查询),这给了我大约1000个查询要写!该怎么做?

解决方案: 我发布了我使用的代码:

PASSWORD=""
db=$1

mysqldump --password=$PASSWORD --set-charset --skip-set-charset --add-drop-table --databases "$db" > /home/dev/backup/bdd.sql

QUERY="ALTER DATABASE \`$db\` DEFAULT CHARACTER SET utf8;"
mysql --password=$PASSWORD --database "$db" -e "$QUERY"

mysql --password=$PASSWORD --default-character-set=utf8 < /home/dev/backup/bdd.sql

请参见下面的回答获取更多信息。

2
“--set-charset”和“--skip-set-charset”不是直接竞争的标志吗?文档说它们影响“SET NAMES”的使用,但不会设置通过每个表输出的“mysqldump”参数“DEFAULT CHARSET=X”。 (mysql 5.5) - fideloper
3个回答

19

你可以使用转储文件非常容易地完成这个操作。使用

mysqldump --skip-opt --set-charset --skip-set-charset 

然后创建另一个数据库,将其默认字符集设置为UTF-8,然后使用以下命令将您的转储加载回来:

mysql --default-character-set=<your iso encoding>

主要想法是制作一个没有任何数据编码迹象的转储。
因此,在创建时,表的编码将继承自数据库编码并设置为UTF-8。使用--default-character-set命令,我们告诉MySQL自动重新编码我们的数据。


哦,这看起来不错!为什么文档上没有提到呢?或者为什么没有人在任何地方谈论它?谢谢,我会测试一下。 - Matthieu Napoli
刚刚我进行了测试(仅在一个数据库上),这并不会改变列的编码方式(它们仍然是“Latin”)。只是为了确保一下,对于mysqldump,这3个参数不需要值吗? - Matthieu Napoli
谢谢,我已经解决了。我所做的是转储、清空数据库(删除表,但保留数据库),将其编码设置为UTF8,然后重新导入内容。这样内容就完全是UTF8格式的,否则它不能完全工作。我已经在我的问题中发布了上述代码。 - Matthieu Napoli
警告:我(艰难地)发现,“--skip-opt”参数会使创建表查询不包括auto_increment语句!(http://groups.google.com/group/comp.databases.mysql/browse_thread/thread/01ccba8f07dc65fc?pli=1)(虽然我不怪你,但我应该测试更多) - Matthieu Napoli
顺便提一下,上述命令不起作用。MySQL(5.1)将继续在级别转储CHARACTER SET latin1 - sorin
显示剩余4条评论

6

我正在使用mysqldump Ver 10.11 Distrib 5.0.77。

由于某些原因,create选项Engine和auto_increment被省略了。这导致很多插入错误,因为主键字段上的auto_increment消失了。

对我来说,这个方法起作用了。我正在使用--opt,并使用sed从sql文件中删除charset。

mysqldump -p --opt --skip-set-charset --add-drop-table dbname > /tmp/dbname.sql
sed -i 's/DEFAULT CHARSET=latin1//g' /tmp/dbname.sql 
ALTER DATABASE dbname DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_danish_ci;
mysql -p --default-character-set=utf8 db < /tmp/dbname.sql 

1
由于Mysql 5.5将输出DEFAULT CHARSET=latin1,而--default-character-set=utf8在导入时无法覆盖该设置,因此需要执行此步骤。我使用了sed -i 's/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/g' /tmp/dbname.sql来显式地将其设置为utf8。 - fideloper

1
mysqldump --opt --skip-set-charset --default-character-set='latin1' -u root -p revive_adserver --result-file='dump.sql'

vim dump.sql

:%s/latin1/utf8/gi

:wq

mysql -u root -p

ALTER DATABASE revive_adserver CHARACTER SET utf8;

\q

mysql -D revive_adserver -u root -p < dump.sql

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