mysql union语句报错:Error Code: 1271. Illegal mix of collations for operation ‘UNION‘
Posted 左直拳
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql union语句报错:Error Code: 1271. Illegal mix of collations for operation ‘UNION‘相关的知识,希望对你有一定的参考价值。
字符集不同报错,使用union汇总结果集的两个表,字符集需要一致。如果表中已有记录,那么调整字符集,现有记录不会产生效果,这时需要重新插入记录,或改变字段长度,迫使内容重写。
最近在mysql的sql中使用union,总是报错,提示
Error Code: 1271. Illegal mix of collations for operation ‘UNION‘
从字面意思看,说什么非法混合,没说什么原因。我考察了一下我那条SQL语句,是从不同的表中读取,然后将结果用“union all”进行合并。字段有数值型也有字符型。如果将字符型全部去掉,可正常执行,否则出错。
select * from (
select
a.userid as id, a.userid as user_id,a.loginname as login_name, 1 as type, a.unitid as owner_id, 1 as status ,b.unitname as owner_name
from org_user a inner join org_unit b on a.unitid=b.unitid and a.userstatus=0
union all
select
a.id, a.user_id,a.login_name, a.type, a.owner_id, a.status,b.name as owner_name
from work_user a inner join work_club b on a.owner_id=b.id and a.type=0 and a.status=1
union all
select
a.id, a.user_id, a.login_name,a.type, a.owner_id, a.status,b.club_name as owner_name
from work_user a inner join work_register_apply b on a.login_name=b.login_name and a.type=0 and a.status=0
) u where user_id=1000 limit 1
猜测应该是字符集的问题。mysql比较奇怪,每个表可以单独指定字符集(也许是每个字段都能单独指定字符集?试了一下,还真是)。
于是修改相应的字符集
ALTER TABLE `beian`.`tmp_work_club`
CHANGE COLUMN `NAME` `NAME` VARCHAR(120) CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_0900_as_ci' NOT NULL COMMENT '俱乐部名称' ;
结果还是报错。真难伺候。世人爱mysql爱得那么狂热,没理由。
想起被调整的表已存在记录,估计是表字符集虽然变了,但现有的值的字符集并没有修改。于是将字段的长度调了一下,目的是迫使重写表数据。最后问题解决。
调整字段长度可能不是一个好的方法。也许将表移到临时表,然后再重新插入更好一些。但自增的字段比较麻烦。
以上是关于mysql union语句报错:Error Code: 1271. Illegal mix of collations for operation ‘UNION‘的主要内容,如果未能解决你的问题,请参考以下文章
ORACLE 两个order by的SQL使用 UNION 或者 UNION ALL 报错 ORA-00933:sql命令未正确结束