使用联合全部时,操作“ concat”的排序规则非法混合

时间:2019-08-20 06:51:29

标签: mysql

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

在没有 UNION ALL 的情况下,我将其拆分为2个SQL,它可以工作。但是,一旦我使用 UNION ALL '运行它,就会发生错误。

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

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完成整个工作,但不是解决方案。 最后,感谢您的阅读和帮助。

2 个答案:

答案 0 :(得分:1)

检查表架构中您实际使用的排序规则 尝试将错误的排序规则(或两者都)转换为相同的
例如usint 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;

答案 1 :(得分:0)

表/列的排序规则不同。

示例:latin1_swedish_ciutf8_general_ci

这篇文章可以帮助您:error Illegal mix of collations for concat
这是Illegal mix of collations for operation 'concat'