【问题标题】:Effects of updating a table with rows from utf8_turkish_ci to utf8_general_ci?使用从 utf8_turkish_ci 到 utf8_general_ci 的行更新表的影响?
【发布时间】:2014-10-15 05:11:46
【问题描述】:

我无法加入某些表,因为有些表/行是 utf8_general_ci,有些是 utf8_turkish_ci。因此,我不得不复制土耳其语,将其转换为通用语,最后使用它。但是我想知道,如果我将原始表从土耳其语转换为通用表,我的应用程序会发生什么?我将 MySQL 与 PHP 一起使用。

这是最初的错误:Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_turkish_ci,IMPLICIT) for operation '='

【问题讨论】:

    标签: mysql utf-8 collation


    【解决方案1】:

    您的列数据使用字符集存储。在这种情况下,它似乎是 utf8。

    当您对这些列进行操作(例如,进行相等比较或排序)时,MySQL 会使用排序规则。每列都有一个默认排序规则,它继承自表的默认排序规则。

    索引具有列的默认排序规则,因此它们可以高效运行。

    您可以进行由排序规则限定的相等比较。例如,在JOIN 中,您可以指定

    ON (turkish.village_name COLLATE utf8_general_ci) = euro.village_name
    

    或许

    ON turkish.village_name = (euro.village_name COLLATE utf8_turkish_ci)
    

    这应该可以消除您的非法排序规则组合,而无需您更改表。这可以帮助您避免您询问的数据库更改。但请注意,使用 COLLATE 限定符可能会破坏索引的使用。如果您有一个大表并且您依赖索引来提高性能,这可能没有帮助。

    那么,如果您更改表以更改默认排序规则会发生什么?

    1. 您的数据不会更改(除非您还更改了字符集)。这很好。
    2. 将重新生成任何涉及带有排序规则的列的索引。
    3. 您的比较和排序可能会发生变化。我不懂土耳其语,所以我不能告诉你什么可能会破坏。但是,例如,在西班牙语中,字母 NÑ 是不一样的。 N 在西班牙语排序规则中位于 Ñ 之前,但在一般排序规则中它们被视为相同。土耳其字母表的某些方面可能相同,因此您的 ORDER BY 结果将不正确。

    但是,您可以通过在 ORDER BY 子句中指定 COLLATE 修饰符来解决此问题。

    ORDER BY (euro.village_name COLLATE utf8_turkish_ci)
    

    【讨论】:

      猜你喜欢
      • 2015-12-11
      • 2014-12-08
      • 2019-11-20
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多