mySQL中的非法排序规则组合

Illegal mix of collations in mySQL

提问人:Pekka 提问时间:2/25/2010 最后编辑:Pekka 更新时间:2/26/2010 访问量:24421

问:

我需要将列从一个表转移到另一个表。源表的排序规则与目标表(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)

MySQL 字符编码 排序规则

评论


答:

2赞 dev-null-dweller 2/25/2010 #1

仅使用 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

评论

0赞 Pekka 2/25/2010
干杯,聪明的主意,但是artnr和barcode都是varchars,即使它们只包含数字数据,所以即使它们单独使用也会导致问题。我会在我的问题中强调这一点。
0赞 dev-null-dweller 2/25/2010
检查我更新的答案,唯一改变的是为每列添加子选择中的排序规则(以及后面的别名正确别名)
37赞 dev-null-dweller 2/26/2010 #2

我尝试了 CONVERT 和 COLLATE 以 UTF-8 运行整个操作,但这无济于事。

这让我很烦恼,所以今天我创建了这些表并成功运行了这个表:

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