【问题标题】:Convert a MySQL database from latin to UTF-8将 MySQL 数据库从拉丁文转换为 UTF-8
【发布时间】:2011-02-02 09:26:12
【问题描述】:

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

有关更多信息,请参阅下面的答案。

【问题讨论】:

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

标签: mysql utf-8 character-encoding


【解决方案1】:

您可以使用转储非常轻松地做到这一点。使用

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

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

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

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

【讨论】:

  • 哦,这看起来不错!为什么文档上没有,或者没有人在任何地方谈论这个,谢谢我会测试它
  • @Matthieu 看来你要用--all-databases 来实现它,请谨慎行事。首先在一个数据库上备份并测试整个算法。
  • 好吧,我刚刚测试过(可以肯定的是,只在一个数据库上),这并没有改变列的编码(它们仍然是“拉丁”)。可以肯定的是,对于 mysqldump,这 3 个参数不需要值?
  • @Matthieu 据我了解,这实际上是 2 个参数。 --skip-opt --set-charset 告诉数据库不要将默认字符集子句添加到表定义中。并且 --skip-set-charset 从转储顶部删除 SET NAMES 查询。你怎么知道数据编码? utf-8 与 latin1 非常相似 如果您为新表运行SHOW CREATE TABLE tablename,它对表编码有何看法?转储中是否有任何字符集?你命名utf8 是否正确(因为它与通常的utf-8 不同)
  • 谢谢,我已经成功了。我要做的是转储,清空数据库(删除表,但保留数据库),将其编码设置为 UTF8,然后重新导入内容。然后内容完全是 UTF8,否则它不能完全工作。我已经在我的问题中发布了上面的代码。
【解决方案2】:

我正在使用 mysqldump Ver 10.11 Distrib 5.0.77

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

这对我有用。我正在使用 --opt 并使用 sed 从 sql 文件中删除字符集。

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 

【讨论】:

  • 由于 Mysql 5.5 将输出DEFAULT CHARSET=latin1--default-character-set=utf8 不会在导入时覆盖,因此这一步是必要的。我使用sed -i 's/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/g' /tmp/dbname.sql 将其显式设置为utf8。
【解决方案3】:
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

【讨论】:

    猜你喜欢
    • 2011-02-28
    • 2012-04-23
    • 1970-01-01
    • 2015-05-16
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    相关资源
    最近更新 更多