我应该将带有latin1_swedish_ci排序规则的MySQL数据库迁移到utf-8,如果是,如何?

时间:2008-10-13 11:16:19

标签: mysql ruby-on-rails character-encoding

我的Rails应用程序使用的MySQL数据库目前的默认排序规则为latin1_swedish_ci。由于Rails应用程序(包括我的)的默认字符集是UTF-8,因此在数据库中使用utf8_general_ci排序规则似乎是明智的。

我的想法是否正确?

假设是,将整理和数据库中的所有数据迁移到新编码的最佳方法是什么?

4 个答案:

答案 0 :(得分:4)

UTF-8以及任何其他Unicode编码方案都可以使用任何语言存储字符,因此它是数据库代码页的绝佳选择。

另一方面,排序规则设置与编码方案完全不同。它涉及排序顺序,大/小写转换,字符串相等比较以及特定于语言的事物。排序规则设置应与数据库中使用的语言相匹配。

UTF-8通用排序规则(我假设在这里 - 我特别不熟悉MySQL)用于语言未知的情况,需要一些简单的默认排序。它可能对应于Unicode代码点排序,如果您要存储瑞典语,几乎肯定不是您想要的。

答案 1 :(得分:1)

转换为UTF-8作为字符集。

整理设置仅用于排序和类似的东西。选择大多数用户期望的排序规则。

答案 2 :(得分:1)

在latin1中正确编码数据库中的现有数据,将表转换为utf8(使用ALTER TABLE,如文档中所述)应该可以正常工作。

然后你的所有应用程序需要做的就是继续做它以前做过的事情。如果你的应用程序想要使用unicode字符,它应该将其连接编码设置为utf8并使用utf8,但这是它自己的问题。


问题在于,大量垃圾网络应用程序历来将utf8数据发送到mysql并告诉它将其视为latin1。 MySQL将完全尊重这一点并按照指示将垃圾保存到表中。

将表从latin1转换为utf8不会修复这个错误,因为你真的确实在那里有完全垃圾。修复它们是非常重要的,特别是如果在应用程序的生命周期中,它一直在向数据库讨论不同类型的垃圾。

答案 3 :(得分:0)

使用以下mysql查询转换列:

ALTER TABLE users MODIFY description VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci;

要查看有关您桌子的完整详情:

SHOW FULL COLUMNS FROM users;