在 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 中非法混合排序规则的主要内容,如果未能解决你的问题,请参考以下文章