【问题标题】:Illegal mix of collations for operation 'concat' while using union all使用 union all 时操作“concat”的排序规则的非法混合
【发布时间】:2019-08-20 06:51:29
【问题描述】:

首先,英语不是我的母语,如果我犯了一些错误,请原谅我。 当我尝试将数据从 mysql5.7 推送到 Redis 时出现此问题,这是关于 MySQL 操作 concat。

没有UNION ALL,我把它分成2个SQL,它可以工作。但是一旦我用UNION ALL'运行它,就会发生错误。

[Err] 1271 - 操作 concat 的排序规则的非法混合

SELECT CONCAT( 
    "*4\r\n",
    '$',LENGTH(redis_cmd),'\r\n',redis_cmd,'\r\n',
    '$',LENGTH(redis_key),'\r\n',redis_key,'\r\n',
    '$',LENGTH(redis_score),'\r\n',redis_score,'\r\n',
    '$',LENGTH(redis_val),'\r\n',redis_val,'\r'
) 
FROM (
SELECT
    'ZADD' AS redis_cmd,
    'GS_TM' AS redis_key,
    s1.QSH AS redis_score,
    CONCAT(s1.GS,':',s1.QSH,':0') AS redis_val
FROM
    gstmfw s1
UNION ALL
SELECT
    'ZADD' AS redis_cmd,
    'GS_TM' AS redis_key,
    s2.ZZH AS redis_score,
    CONCAT(s2.GS,':',s2.ZZH,':1') AS redis_val
FROM
    gstmfw s2
) AS gstmfw;

我想在一个 sql 中完成整个工作,但不是解决方案。 最后,感谢您的阅读和帮助。

【问题讨论】:

  • 您的表/列有不同的排序规则。

标签: mysql


【解决方案1】:

在您的表架构中检查您真正使用的排序规则 尝试在同一个中转换错误的排序规则(或两者)
例如使用utf8

  SELECT CONCAT( 
      "*4\r\n",
      '$',LENGTH(redis_cmd),'\r\n',redis_cmd,'\r\n',
      '$',LENGTH(redis_key),'\r\n',redis_key,'\r\n',
      '$',LENGTH(redis_score),'\r\n',redis_score,'\r\n',
      '$',LENGTH(redis_val),'\r\n',redis_val,'\r'
  ) 
  FROM (
  SELECT
      'ZADD' AS redis_cmd,
      'GS_TM' AS redis_key,
      s1.QSH AS redis_score,
      CONCAT(s1.GS,':',s1.QSH,':0') AS redis_val
  FROM
      gstmfw s1
  UNION ALL
  SELECT
      convert('ZADD' USING utf8) AS redis_cmd,
      convert('GS_TM'USING utf8) AS redis_key,
      convert(s2.ZZH USING utf8) AS redis_score,
      convert(CONCAT(s2.GS,':',s2.ZZH,':1') USING utf8) AS redis_val
  FROM
      gstmfw s2
  ) AS gstmfw;

【讨论】:

    【解决方案2】:

    您的表/列有不同的排序规则。

    示例:latin1_swedish_ci 和 utf8_general_ci

    这篇文章可能会有所帮助:error Illegal mix of collations for concat
    还有这个:Illegal mix of collations for operation 'concat'

    【讨论】:

    • Inside table gstmfw 为列 GS 和 QSH 以及 GS 和 ZZH 设置了什么排序规则?
    • 我检查了我的列,发现 GS 列不是 utf8 编码,我更正它并且有效。谢谢我的朋友!
    猜你喜欢
    • 2011-12-06
    • 2014-05-20
    • 2013-12-25
    • 1970-01-01
    • 2016-12-08
    • 2015-01-29
    • 2016-02-01
    • 1970-01-01
    相关资源
    最近更新 更多