mysql 8 中的字符集转换问题

问题描述 投票:0回答:1

我有一个带有 latin1 列的表:

创建表

table_latin
id
int 无符号 NOT NULL AUTO_INCRMENT,
char_id
char(6) NOT NULL,
v
varchar(128) NOT NULL, 主键 (
id
), 关键
char_id
(
char_id
) ) 引擎=InnoDB 默认字符集=latin1

插入table_latin(char_id, v)values('aaaa','bbbb');

设置名称utf8mb3; (设置connection_character_set/ collation = ‘utf8mb3’);

选择 char_id FROM

table_latin
UNION ALL SELECT 'N/A'

这工作得很好。由于表列 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。我是不是错过了什么?

mysql database database-administration
1个回答
0
投票

将子查询处的字符串文字转换为

latin1
;使用
CONVERT()

SELECT char_id FROM `table_latin` UNION ALL SELECT CONVERT('N/A' USING latin1)
© www.soinside.com 2019 - 2024. All rights reserved.