在 mySQL 中非法混合排序规则

Posted

技术标签:

【中文标题】在 mySQL 中非法混合排序规则【英文标题】:Illegal mix of collations in mySQL 【发布时间】:2011-01-20 15:07:56 【问题描述】:

我需要将一列从一个表转移到另一个表。源表具有与目标表不同的排序规则(latin1_general_ci 和 latin1_swedish_ci)。

我用

UPDATE target 
LEFT JOIN source ON target.artnr = source.artnr 
SET target.barcode = source.barcode

我得到一个“非法的排序规则组合”。

有什么快速解决方法可以在不更改任一表的情况下使其正常工作?我尝试使用 CONVERT 和 COLLATE 以 UTF-8 运行整个操作,但这并没有帮助。 “条形码”仅包含数字数据(即使它们都是 VARCHAR),因此无论哪种方式都无需担心排序规则。我只需要这样做一次。

编辑:我在涉及的每个字段上使用CAST(fieldname as unsigned) 对其进行了排序。在这种情况下,我能够做到这一点,因为只有数字数据受到影响,但很高兴知道对此有更通用的方法,因此我将问题留待解决。

【问题讨论】:

【参考方案1】:

我尝试使用 CONVERT 和 COLLATE 以 UTF-8 运行整个操作,但这没有帮助。

它困扰了我,所以今天我创建了这些表并成功运行了这个:

UPDATE target
LEFT JOIN  source ON( target.artnr = source.artnr COLLATE latin1_swedish_ci )
SET target.barcode = source.barcode

【讨论】:

【参考方案2】:

仅使用 2 个数字列加入 select 怎么样?

UPDATE target
LEFT JOIN (
    SELECT 
        artnr COLLATE latin1_swedish_ci AS artnr,
        barcode COLLATE latin1_swedish_ci AS barcode
     FROM source
    ) source ON target.artnr = source.artnr
SET target.barcode = source.barcode

【讨论】:

干杯,聪明的想法,但即使它们只包含数字数据,artnr 和条形码都是 varchars,所以即使它们单独也会导致问题。我会在我的问题中强调这一点。 检查我更新的答案,唯一改变的是在子选择中为每一列添加排序规则(并在其后加上适当的别名)

以上是关于在 mySQL 中非法混合排序规则的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 视图 - 排序规则的非法混合

排序规则的非法混合 MySQL 错误

MySQL 非法混合排序规则

MySQL排序顺序 - 排序规则?

MySQL某些字符导致“非法混合排序规则”错误

MySql 中的非法混合排序规则错误