我的 Rails 应用程序使用的 MySQL 数据库当前具有默认排序规则latin1_swedish_ci
. utf8_general_ci
由于 Rails 应用程序(包括我的)的默认字符集是 UTF-8,因此在数据库中使用排序规则对我来说似乎是明智的。
我的想法正确吗?
假设是,将排序规则和数据库中的所有数据迁移到新编码的最佳方法是什么?
我的 Rails 应用程序使用的 MySQL 数据库当前具有默认排序规则latin1_swedish_ci
. utf8_general_ci
由于 Rails 应用程序(包括我的)的默认字符集是 UTF-8,因此在数据库中使用排序规则对我来说似乎是明智的。
我的想法正确吗?
假设是,将排序规则和数据库中的所有数据迁移到新编码的最佳方法是什么?
UTF-8 以及任何其他 Unicode 编码方案可以存储任何语言的字符,因此它是数据库代码页的绝佳选择。
另一方面,排序规则设置是与编码方案完全不同的问题。它涉及排序顺序、大写/小写转换、字符串相等比较以及诸如特定于语言的内容。排序规则设置应与数据库中使用的语言相匹配。
UTF-8 通用排序规则(我在这里假设——我特别不熟悉 MySQL)用于语言未知且需要一些简单的默认排序的情况。它可能对应于 Unicode 代码点顺序,如果您存储瑞典语,这几乎肯定不是您想要的。
转换为 UTF-8 作为字符集。
排序规则设置仅用于排序和类似的东西。选择大多数用户期望的排序规则。
提供数据库中的现有数据以 latin1 正确编码,将表转换为 utf8(使用 ALTER TABLE,如文档中所述)应该可以正常工作。
然后你的应用程序需要做的就是继续做它以前做过的任何事情。如果你的应用程序想要使用 unicode 字符,它应该将其连接编码设置为 utf8 并使用 utf8,但这是它自己的问题。
问题是,历史上大量的垃圾网络应用程序将utf8数据发送到mysql并告诉它把它当作latin1。MySQL 将完全遵守这一点,并按照指示将垃圾保存到表中。
将表格从 latin1 转换为 utf8 将无法修复此错误,因为您确实确实有垃圾。修复它们并非易事,尤其是在应用程序的生命周期中,它一直在向数据库发送不同类型的垃圾。
使用下面的 mysql 查询来转换您的列:
ALTER TABLE users MODIFY description VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci;
要查看有关您的表的完整详细信息:
SHOW FULL COLUMNS FROM users;