使用utf8_turkish_ci中的行更新表到utf8_general_ci的效果?

时间:2014-08-21 14:08:15

标签: mysql utf-8 collation

我无法加入某些表,因为有些表/行是utf8_general_ci,有些是utf8_turkish_ci。因此,我不得不将土耳其人改名为将军,将其转换为将军并最终使用它。但我想知道,如果我将原始表从土耳其语转换为通用语,我的应用程序会发生什么?我在PHP中使用MySQL。

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

1 个答案:

答案 0 :(得分: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结果将不正确。
  4. 但是,您可以通过在COLLATE子句中指定ORDER BY修饰符来解决此问题。

    ORDER BY (euro.village_name COLLATE utf8_turkish_ci)