【DM版本】:
DM Database Server 64 V8
DBVersion: 0x7000d
03134284368-20250430-272000-20149
Msg Version: 43
Gsu level(5)cnt:0
【操作系统】:
【问题描述】*:
select子查询使用union并且字段有char(1)类型时,返回结果集中出现多余空格
SELECT PARA_NAME, PARA_VALUE
FROM V$DM_INI
WHERE PARA_NAME IN ('LANGUAGE', 'CHARSET', 'LENGTH_IN_CHAR');
返回结果:LENGTH_IN_CHAR 0
CREATE TABLE JS_SYS_MENU (
MENU_CODE VARCHAR2(64) NOT NULL,
MENU_NAME VARCHAR2(100) NOT NULL,
MENU_TYPE CHAR(1) NOT NULL,
MENU_HREF VARCHAR2(1000) NULL,
WEIGHT NUMBER(4,0) NULL,
IS_SHOW CHAR(1) NOT NULL,
STATUS CHAR(1) DEFAULT '0' NOT NULL,
CONSTRAINT CONS134218916 PRIMARY KEY (MENU_CODE)
);
SELECT
a.menu_code AS "menuCode",
a.menu_name AS "menuNameRaw",
trim(a.menu_type) AS "menuType",
a.menu_href AS "menuHref",
a.weight AS "weight",
trim(a.is_show) AS "isShow",
trim(a.status) AS "status"
FROM
(
SELECT DISTINCT a.* FROM js_sys_menu a WHERE a.status = '0'
UNION
SELECT DISTINCT a.* FROM js_sys_menu a WHERE a.status = '1'
) a
ORDER BY
a.menu_code
实际子查询中js_sys_menu会有一些关联表,所以需要 UNION,但为方便问题复现,我删除了join,仅添加一个条件
添加 trim 函数,比如:trim(a.status) AS "status" 可以避免该问题
但我在达梦旧版本中,未出现上述问题,版本:
DM Database Server 64 V8
DB Version: 0x7000c
03134284058-20230726-197096-20046
但 LENGTH_IN_CHAR 参数为 1,不知道是否有关系?
因为项目中用到的 char(1) 类型字段较多,多处使用了 UNION,期待回复,谢谢。
03134284368-20251219-307534-20149 Pack53 --验证的版本2
03134284368-20250325-266127-20149 --验证的版本1
基于帖子中的示例,在上述两个版本验证,未能重现问题。提供的查询SQL语句,不需要trim,返回类型都是CHAR(1),没有多余的空格。
如果加了trim,返回的类型应该是VARCHAR(1).
官网下载的开发版,目前有这个问题。具体版本如下:
数据库直接执行相关SQL,返回如下数据。
查看系统中数据,显示有多余空格,如下图:
数据库类型为 CHAR(1),字段有这问题,改为varchar(1),访问题消失。

可以补充一下构造数据的脚本,方便重现