提问人:Pekka 提问时间:2/25/2010 最后编辑:Pekka 更新时间:2/26/2010 访问量:24421
mySQL中的非法排序规则组合
Illegal mix of collations in mySQL
问:
我需要将列从一个表转移到另一个表。源表的排序规则与目标表(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)
答:
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
评论