当我像下面一样查询我的表时,“NAME”列的输出太长了。我最近将数据类型更改为VARCHAR2(150)而不是VARCHAR(150),以便不保存空格。但是,输出似乎还包括(某些?)空格。任何人都可以清楚这里发生了什么吗?我在这里看空白,或者问题只是我的终端/控制台,还是SQLPLUS本身与它有关?使用Windows终端。
SQL> SELECT * FROM SYS.O1_Orders;
ID
----------
NAME
--------------------------------------------------------------------------------
QUANTITY PRICE
---------- ----------
1
Cakes
25 200
答案 0 :(得分:3)
这纯粹是SQL * Plus显示问题。 VARCHAR
和VARCHAR2
数据类型之间没有差异(当前) - 也不会对您保存的数据进行空格键填充。只有CHAR
列才会这样做。
在SQL * Plus中,您可以控制name
列的显示范围
SQL> column name format a30;
例如,将告诉SQL * Plus使用30列来显示name
列中的数据。您可以向上或向下调整,具体取决于数据的实际长度,您希望在一行中放入多少数据等。您必须将它与SQL语句一起放在脚本中,否则您将需要在发出语句之前在每个会话中复制它,或者您需要将它添加到login / glogin.sql文件中。
如果您尝试生成固定宽度的文本报告,SQL * Plus是一个可爱的工具。但是,如果您只是以交互方式运行查询,那么它不是最便于用户使用的解决方案 - 调整文本列的宽度,处理比您的行更长的输出等等。如果您正在进行交互式开发,那么像SQL Developer这样的工具具有适当的GUI会更加友好。
答案 1 :(得分:2)
varchar2
在存储时没有空白填充,但varchar
也没有,这对SQL * Plus如何显示它没有任何影响。
SQL * Plus显示具有可包含的最大宽度的列,它在检索实际结果集之前从查询元数据中获取。否则,它必须获取所有值,将它们保存在某处,找到最长值的长度,然后才开始产生输出。并且输出会随着不同的执行而变化,这可能对报告没有用。
您有几个选择。如果你知道这个值永远不会超过一定长度(在这种情况下为什么列的最大大小会大于那个?)那么你可以将它强制转换为那个,或告诉SQL * Plus使用{*的列宽度3}}:
column name format a20
with the column
command。但是如果它们确实发生了更长的值(或者如果在查询中转换/截断,数据将会丢失)。
您也可以将所有输出放在一行上,但您没有明确询问这些内容,但会让事情看起来更整洁:
set linesize 200
...或者某些值足以容纳所有列。当然,您可以将两种设置结合起来。单行仍然可以在您的终端窗口中进行包装,因此您可以根据需要将其更宽。
答案 2 :(得分:0)
您可以使用 SET NUM [WIDTH] {10 | N} 强>
设置显示数字的默认宽度。
或使用 SET LONG {80 | N} 强>
设置显示BLOB,BFILE,CLOB,LONG,NCLOB和XMLType值的最大宽度(以字节为单位)。
如果存在用于在所有VARCHAR2字段中显示固定宽度的SET选项,则问题仍然存在。至于我所知道的,如上所述,你可以使用 COLUMN column_name FORMAT 模型来格式化特定的( !)特定表格的列。