Mysql 使用从utf8\u turkish\u ci到utf8\u general\u ci的行更新表的效果?

Mysql 使用从utf8\u turkish\u ci到utf8\u general\u ci的行更新表的效果?,mysql,utf-8,collation,Mysql,Utf 8,Collation,我无法联接一些表,因为有些表/行是utf8\u general\u ci,有些是utf8\u turkish\u ci。因此,我不得不将土耳其语的一个重复,转换成通用,最后使用它。然而,我想知道,如果我将原始表格从土耳其语转换为general,我的应用程序会发生什么变化?我在PHP中使用MySQL 这是最初的错误:操作“=”的排序规则(utf8\u general\u ci,隐式)和(utf8\u turkish\u ci,隐式)非法混合使用。您的列数据使用字符集存储。在这种情况下,它似乎是ut

我无法联接一些表,因为有些表/行是utf8\u general\u ci,有些是utf8\u turkish\u ci。因此,我不得不将土耳其语的一个重复,转换成通用,最后使用它。然而,我想知道,如果我将原始表格从土耳其语转换为general,我的应用程序会发生什么变化?我在PHP中使用MySQL


这是最初的错误:
操作“=”的排序规则(utf8\u general\u ci,隐式)和(utf8\u turkish\u ci,隐式)非法混合使用。
您的列数据使用字符集存储。在这种情况下,它似乎是utf8

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

索引中嵌入了列的默认排序规则,因此可以有效地运行

可以通过排序规则进行等式比较。例如,在
连接中
可以指定

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

ON turkish.village_name = (euro.village_name COLLATE utf8_turkish_ci)
这将消除非法的排序规则混合,而无需更改表。这可能会帮助您避免所询问的数据库更改。但是要注意,使用
COLLATE
限定符可能会挫败索引的使用。如果您有一个很大的表,并且依赖索引来获得性能,那么这可能没有什么帮助

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

  • 数据不会更改(除非同时更改字符集)。那很好
  • 任何涉及具有排序规则的列的索引都将重新生成
  • 您的比较和排序可能会更改。我不懂土耳其语,所以我不能告诉你什么东西会坏。但是,例如,在西班牙语中,字母Nñ是不同的N在西班牙语校勘中位于之前,但在一般校勘中,它们被视为相同。土耳其语字母表中可能有某些方面的工作原理相同,因此您的
    ORDER BY
    结果将不正确
  • 但是,您可以通过在
    orderby
    子句中指定
    COLLATE
    修饰符来解决这个问题

    ORDER BY (euro.village_name COLLATE utf8_turkish_ci)