【发布时间】: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!将 collate utf8mb4_unicode_ci 添加到联合中的第一个查询中,看起来它正在工作