将MySQL数据库从拉丁语转换为UTF-8

时间:2010-03-30 09:10:14

标签: mysql utf-8 character-encoding

我正在将网站从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

有关详细信息,请参阅以下答案。

3 个答案:

答案 0 :(得分:19)

您可以使用转储轻松完成此操作。使用

进行转储
mysqldump --skip-opt --set-charset --skip-set-charset 

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

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

主要思想是在没有任何数据编码迹象的情况下进行转储 因此,在创建时,表的编码将从数据库编码继承并设置为UTF-8。使用--default-character-set,我们告诉MySQL自动重新编码我们的数据。

答案 1 :(得分:6)

我正在使用mysqldump Ver 10.11 Distrib 5.0.77

由于某种原因,省略了创建选项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 

答案 2 :(得分: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