我无法加入某些表,因为有些表/行是 utf8_general_ci,有些是 utf8_turkish_ci。因此我不得不复制土耳其语,将其转换为通用语,最后使用它。但我想知道,如果我将原始表从土耳其语转换为通用表,我的应用程序会发生什么情况?我使用 MySQL 和 PHP。
这是最初的错误:Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_turkish_ci,IMPLICIT) for operation '='
您的列数据是使用字符集存储的。在本例中,它似乎是 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
限定符可以击败索引的使用。如果您有一个很大的表并且您依赖索引来提高性能,那么这可能没有帮助。
那么,如果您更改表以更改默认排序规则,会发生什么情况?
- 您的数据不会改变(除非您也更改字符集)。那很好。
- 任何涉及带有排序规则的列的索引都将被重新生成。
- 您的比较和排序可能会发生变化。我不懂土耳其语,所以我无法告诉你什么可能会出问题。但是,例如,在西班牙语中,字母N and Ñ不一样。N出现在之前Ñ在西班牙语排序规则中,但在一般排序规则中,它们被视为相同。土耳其字母表的某些方面可能是相同的,所以你的
ORDER BY
结果将不正确。
但是,您可以通过指定一个来解决这个问题COLLATE
修饰符在你的ORDER BY
clause.
ORDER BY (euro.village_name COLLATE utf8_turkish_ci)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)