MySQL - 用于操作“UNION”的排序规则(utf8_general_ci,COERCIBLE)和(latin1_swedish_ci,IMPLICIT)的非法混合
Posted
技术标签:
【中文标题】MySQL - 用于操作“UNION”的排序规则(utf8_general_ci,COERCIBLE)和(latin1_swedish_ci,IMPLICIT)的非法混合【英文标题】:MySQL - Illegal mix of collations (utf8_general_ci,COERCIBLE) and (latin1_swedish_ci,IMPLICIT) for operation 'UNION' 【发布时间】:2010-09-16 01:19:42 【问题描述】:如何一劳永逸地修复该错误?我只想能够在 mysql 中进行联合。
(我正在寻找一种捷径,例如让 MySQL 忽略该问题或采取最佳猜测的选项,而不是希望更改 100 多个表的排序规则……至少今天不会)
【问题讨论】:
【参考方案1】:不确定 mySQL,但在 MSSQL 中,您可以更改查询中的排序规则,例如,如果您有 2 个具有不同排序规则的表并且您想加入它们,或者在您的情况下使用 crate UNION 您可以这样做
select column1 from tableWithProperCollation
union all
select column1 COLLATE SQL_Latin1_General_CP1_CI_AS from tableWithDifferentCollation
当然,SQL_Latin1_General_CP1_CI_AS 只是您想要“转换”为的排序规则的一个示例
【讨论】:
这可能有效,但我的查询选择了大约 80 列,其中一些由更多列组成。编辑整个查询需要一段时间。不只是“忽略排序错误”设置吗? :-) 不幸的是我不知道,但我会怀疑。那么,您将如何选择两个不兼容列的并集的排序规则(假设它们都不是默认排序规则)? 在我看来,MySQL 应该强制其中一个联合查询的结果匹配另一个,至少如果用户设置了一个设置来这样做。它遵循与 select concat(1,'a'); 类似的理念。给'1a'。 .. 但我不是数据库语言设计师。 没错,这可能是有道理的。如果您没有快速回答您的问题,也许您可以考虑更改表格中的排序规则。也许有一种方法可以编写/自动化它。在这里询问,也许正确的修复也会更快:)【参考方案2】:感谢克里斯托夫。在这种情况下,它是由在第一次选择中选择文字引起的,而不是来自任何不同的表排序规则。
具有讽刺意味的是,我通过关注我为那个问题制作的 old blog post 让它工作了。
【讨论】:
【参考方案3】:我发现一个看似简单的修复方法是更改给您带来问题的整个数据库。我认为这可能不是最好的方法,但它对我有用而且很容易。我在 MySQL 中运行这个命令:
ALTER DATABASE databasename COLLATE utf8_unicode_ci;
【讨论】:
以上是关于MySQL - 用于操作“UNION”的排序规则(utf8_general_ci,COERCIBLE)和(latin1_swedish_ci,IMPLICIT)的非法混合的主要内容,如果未能解决你的问题,请参考以下文章