MySQL UTF8转换-为什么转储数据库?

MySQL UTF8转换-为什么转储数据库?,mysql,utf-8,Mysql,Utf 8,我需要将我的MySQL数据库从latin1\u sweedish\u ci转换为utf8,看起来utf8\u bin是我的理想选择。我一直在读到一些人已经导出了他们的数据库并重新创建了它们。这真的有必要吗?我不能运行查询来转换数据吗 我看到一个人在安装MySQL 5时,在MySQL编译期间指定了UTF-8。您必须导出数据库并转换它们。设置数据库、表和行编码会更改它们在将来的操作方式,但不会转换已存储的数据 没有免费的数据库编码交换午餐 在MySQL 5中,必须重置数据库、表和列的所有字符编码,然

我需要将我的MySQL数据库从
latin1\u sweedish\u ci
转换为
utf8
,看起来
utf8\u bin
是我的理想选择。我一直在读到一些人已经导出了他们的数据库并重新创建了它们。这真的有必要吗?我不能运行查询来转换数据吗


我看到一个人在安装MySQL 5时,在MySQL编译期间指定了
UTF-8

您必须导出数据库并转换它们。设置数据库、表和行编码会更改它们在将来的操作方式,但不会转换已存储的数据

没有免费的数据库编码交换午餐

在MySQL 5中,必须重置数据库、表和列的所有字符编码,然后重新导入数据。这是一个很好的逐步实现的资源

我建议阅读Wordpress操作指南,因为这些步骤解释得很清楚,但重点是:

Set DB char Set:

ALTER DATABASE db_name CHARACTER SET utf8 COLLATE utf8_unicode_ci;
然后设置现有表格编码:

ALTER TABLE db_table CHARACTER SET utf8 COLLATE utf8_unicode_ci;
然后使用一种编码转储,使用另一种编码重新导入

mysqldump --user=username --password=password --default-character-set=latin1_swedish_ci dbname > dump.sql

mysql --user=username --password=password --default-character-set=utf8 dbname < dump.sql
mysqldump--user=username--password=password--default character set=latin1\u-swedish\u-ci-dbname>dump.sql
mysql--user=username--password=password--default character set=utf8 dbname

请注意,如果您不想转储和重新加载整个数据库,您可以通过将每个文本列转换为等效的blob类型,然后将其转换回具有Wordpress指南中所述的所需编码的文本列来逐列执行更改。

无需转储和重新加载。您可以让MySQL对值进行转码,但必须为包含文本数据的每一列发出ALTER。很烦人,你必须写一个脚本来生成它!之后,您仍然需要更改所有默认值

ALTER TABLE `foo` CHANGE `mycolumn` `mycolumn` 
TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL

为我做所有的转换,包括列,但我需要做的是为数据库中的每个表编写这个。

为什么不
ci
,但是
bin
?据我所知,
A=Ä
如果我在MySQL比较中不使用
utf8_-bin
,将返回true。A!=是的,所以我不想让它变成真的。当然,你可以用。@Kerrek SB:这不是他说的needs@Webnetutf8_general_ci中的
A=Ä
,但
A!=这里不需要utf8中的
unicode\u ci
iconv
。我甚至会说在这种情况下是邪恶的。您已经提供了一个指向WP指南的链接,它根本不使用
iconv
;-)
然后转换数据
——不,数据应该保持原样。@zerkms,谢谢你的真实性检查。我从以前MySQLs的旧脚本中提取了iconv。用
mysqldump
steps更新了答案。这样更好,+1;-)@Shelhamer在ALTER TABLE语句之前转储数据库不是更好吗?@Andreas Krueger,对不起,这是我手指的答案,不是我的大脑。这两个
ALTER
语句都应该设置在未来操作中与db一起使用的编码,但不更改已存储的数据。正确的步骤是1)改变。。字符集2)转储3)导入w/新字符设置因此,即使在运行该查询之后,我也必须让脚本遍历并对所有数据进行编码?是否可以在MySQL中对数据进行编码?
ALTER TABLE `foo` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;