You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle 19c与12c SQL*Plus中VARCHAR2默认格式差异及恢复咨询

问题描述

我们正将数据库从12c升级至19c,同步升级Oracle客户端后,部分通过SQL*Plus生成报表的任务出现格式问题:VARCHAR2字段的默认输出格式发生变化。

测试表及数据定义如下:

create table tmp_test (test_id varchar2(9) , test_name varchar2(30));
insert into tmp_test (TEST_ID, TEST_NAME) values ('123456789', 'test name 123456789');
insert into tmp_test (TEST_ID, TEST_NAME) values ('987654321', 'test name 987654321');
commit;

在12c SQL*Plus中,默认输出为列横向排列:

SQL*Plus: Release 12.2.0.1.0 Production on Mon Oct 16 13:17:44 2023

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

Last Successful login time: Mon Oct 16 2023 13:08:53 +01:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

SQL> select * from tmp_test;

TEST_ID   TEST_NAME
--------- ------------------------------
123456789 test name 123456789
987654321 test name 987654321

SQL>

但升级到19c SQL*Plus后,默认输出变为列纵向单独排列:

SQL*Plus: Release 19.0.0.0.0 - Production on Mon Oct 16 13:25:59 2023
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

Last Successful login time: Mon Oct 16 2023 13:17:44 +01:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.19.0.0.0

SQL> select * from tmp_test;

TEST_ID
------------------------------------
TEST_NAME
--------------------------------------------------------------------------------
123456789
test name 123456789

987654321
test name 987654321


SQL>

咨询以下两个问题:

  1. 能否无需添加显式列格式化(如column test_id format a9)将格式恢复为12c版本?
  2. 该格式变更是否有官方文档记录?
解决方案与说明

1. 无需显式列格式化恢复12c输出格式

可以通过调整SQL*Plus的全局参数实现,有两种常用方式:

  • 调整LINESIZE参数:
    19c SQL*Plus默认的列显示宽度有所增大,当所有列的总宽度(含列间分隔符)超过LINESIZE的默认值(通常为80)时,会自动换行成纵向排列。只需设置足够大的LINESIZE值,确保列总宽度在范围内即可:

    SET LINESIZE 120
    

    设置后重新执行查询,输出会恢复为12c的横向排列格式。

  • 设置DEFAULTCOLWIDTH参数:
    19c中SQL*Plus对VARCHAR2列的默认显示宽度计算方式发生变化,可通过DEFAULTCOLWIDTH指定全局默认列宽,让其匹配12c的行为:

    SET DEFAULTCOLWIDTH 30
    

    该参数会让所有VARCHAR2列的默认显示宽度不超过指定值(若列定义长度小于该值,则使用列定义长度),从而避免总宽度超出LINESIZE导致换行。

2. 官方文档记录

该格式变更属于SQLPlus在18c版本引入的行为调整,后续19c沿用了此特性。相关内容可在《Oracle Database SQLPlus User's Guide and Reference》的新特性章节中找到,文档明确说明了SQL*Plus对VARCHAR2列默认显示宽度的计算逻辑变更,以及DEFAULTCOLWIDTH等参数的作用调整。

内容的提问来源于stack exchange,提问作者StefanG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 09:44:54