【问题标题】:Should I migrate a MySQL database with a latin1_swedish_ci collation to utf-8 and, if so, how?我是否应该将带有 latin1_swedish_ci 排序规则的 MySQL 数据库迁移到 utf-8,如果是,如何迁移?
【发布时间】:2008-10-13 11:16:19
【问题描述】:

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

我的想法对吗?

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        那么您的应用程序需要做的就是继续做之前所做的一切。如果你的应用程序要使用unicode字符,它应该将它的连接编码设置为utf8并使用utf8,但这是它自己的问题。


        问题是,历史上大量的垃圾web应用程序将utf8数据发送到mysql并告诉它把它当作latin1。 MySQL 将完全遵守这一点,并按照指示将垃圾保存到表中。

        将表格从 latin1 转换为 utf8 并不能修复此错误,因为您确实在其中完全有垃圾。修复它们并非易事,尤其是在应用程序的生命周期中,它一直在向数据库发送不同类型的垃圾。

        【讨论】:

        • 嗯,数据来自一个 Rails 应用程序,它的字符编码设置为 utf-8,而不是 latin1。大概这会将我的应用程序放入将 utf-8 发送到 latin1 表的“垃圾网络应用程序”类别中?你建议我做什么来转换数据?
        • 这个答案混淆了排序规则和字符编码
        【解决方案4】:

        使用下面的 mysql 查询来转换你的列:

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

        要查看有关您的桌子的完整详细信息:

        SHOW FULL COLUMNS FROM users;
        

        【讨论】:

          猜你喜欢
          • 2017-07-15
          • 1970-01-01
          • 2015-08-26
          • 2018-11-21
          • 1970-01-01
          • 2023-03-22
          • 2022-01-22
          • 1970-01-01
          • 2012-07-27
          相关资源
          最近更新 更多