【问题标题】:Error Code: 1271. Illegal mix of collations for operation 'UNION' on mysql错误代码:1271. mysql 上操作“UNION”的排序规则的非法混合
【发布时间】:2021-03-16 05:37:18
【问题描述】:

我有一个这样设计的视图,

 SELECT ('header1,header2,header3,header' ) as `line` 
    UNION ALL 
 SELECT DISTINCT CONCAT(column1,column2,column3,column4) as `line`
from mytables t 
  join table2 gc ON (gc.code = t.code)
where t.myfield = getId() 

getId()函数长这样,

DELIMITER $$
CREATE FUNCTION `getId`() RETURNS varchar(30) CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci
    NO SQL
    DETERMINISTIC
return @bid$$
DELIMITER ;

为了跟踪错误,我经历了一个消除过程,我通过删除和添加列来重新创建视图,当 column4 添加到视图时发生错误。

table2 的表定义,其中 column4 是从中获取的,

CREATE TABLE `table2` (
  `code` int NOT NULL,
  `column4` varchar(100) NOT NULL
  PRIMARY KEY (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

我在视图 theview 上使用以下查询(出现 非法混合排序规则以操作“UNION” 错误),

SELECT distinct s.* FROM (SELECT @bid:='AB') parm, `theview` s;

我在其他视图上使用 getId() 函数,但那里没有出现错误。

【问题讨论】:

  • UNION 中的第一个子查询对列使用服务器排序规则,而第二个子查询从表结构中获取排序规则。他们似乎不是强制性的。在查询中使用不正确的排序规则明确指定所需的排序规则。例如,SELECT ('header1,header2,header3,header' ) COLLATE {latin1_???} as `line` UNION ..
  • 谢谢@Akina!将 collat​​e utf8mb4_unicode_ci 添加到联合中的第一个查询中,看起来它正在工作

标签: mysql mysql-8.0


【解决方案1】:

根据收到的问题建议,我将 collat​​e utf8mb4_unicode_ci 添加到第一个查询中,因此查询现在看起来像,

SELECT ('header1,header2,header3,header' ) collate utf8mb4_unicode_ci as `line`

看起来它已经成功了。

【讨论】:

    猜你喜欢
    • 2014-05-20
    • 1970-01-01
    • 2013-12-25
    • 2016-02-01
    • 2015-03-20
    • 2010-11-03
    • 2017-10-19
    相关资源
    最近更新 更多