我有一个带有 latin1 列的表:
创建表
(table_latin
int 无符号 NOT NULL AUTO_INCRMENT,id
char(6) NOT NULL,char_id
varchar(128) NOT NULL, 主键 (v
), 关键id
(char_id
) ) 引擎=InnoDB 默认字符集=latin1char_id
插入table_latin(char_id, v)values('aaaa','bbbb');
设置名称utf8mb3; (设置connection_character_set/ collation = ‘utf8mb3’);
选择 char_id FROM
UNION ALL SELECT 'N/A'table_latin
这工作得很好。由于表列 char_id 与文字字符串“N/A”(4) 相比具有较低的可强制转换性 (2),因此 utf8mb3 文字字符串会转换为 latin1(因为两者都只有 ascii 指令集)。
但是,在执行稍微修改形式的查询时:
> SELECT char_id FROM `table_latin` UNION ALL SELECT * FROM (SELECT 'N/A') a
它会抛出以下错误: 操作“UNION”的排序规则 (latin1_swedish_ci,IMPLICIT) 和 (utf8mb3_general_ci,COERCIBLE) 的非法混合
如果我检查嵌套查询的可强制性,它仍然是 4。
SELECT coercibility(a.test) FROM (SELECT 'N/A' as 'test') a > 4
理论上第二个实体的字符集必须转换为latin1。我是不是错过了什么?
将子查询处的字符串文字转换为
latin1
;使用 CONVERT()
SELECT char_id FROM `table_latin` UNION ALL SELECT CONVERT('N/A' USING latin1)