【问题标题】:Illegal mix of collations in mySQL在 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) 对其进行了排序。在这种情况下,我能够做到这一点,因为只有数字数据受到影响,但很高兴知道对此有更通用的方法,因此我将问题留待解决。

【问题讨论】:

    标签: mysql character-encoding collation


    【解决方案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,所以即使它们单独也会导致问题。我会在我的问题中强调这一点。
      • 检查我更新的答案,唯一改变的是在子选择中为每一列添加排序规则(并在其后加上适当的别名)
      猜你喜欢
      • 2012-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      • 2012-12-13
      • 2017-10-19
      • 2019-04-10
      相关资源
      最近更新 更多