【问题标题】:SQLPlus varchar2 outputs whitespacesSQLPlus varchar2 输出空格
【发布时间】:2014-10-26 11:41:09
【问题描述】:
当我像下面这样查询我的表时,“NAME”列的输出太长了。我最近将数据类型更改为 VARCHAR2(150) 而不是 VARCHAR(150) 以不保存空格。但是,无论如何,输出似乎都包含(一些?)空格。谁能澄清这里发生了什么?我是在看空格,还是问题只是我的终端/控制台,还是 SQLPLUS 本身与它有关?使用 Windows 的终端。
SQL> SELECT * FROM SYS.O1_Orders;
ID
----------
NAME
--------------------------------------------------------------------------------
QUANTITY PRICE
---------- ----------
1
Cakes
25 200
【问题讨论】:
标签:
oracle
oracle11g
terminal
sqlplus
【解决方案1】:
这纯粹是一个 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 的工具会更友好。
【解决方案2】:
varchar2 在存储时没有空白填充,但varchar 也没有,这对 SQL*Plus 的显示方式没有影响。
SQL*Plus 以它可以包含的最大宽度显示列,它在检索实际结果集之前从查询元数据中获得。否则它将必须获取所有值,将它们保存在某个地方,找到最长值的长度,然后才开始生成输出。并且输出会随着不同的执行而变化,这可能对报告没有用处。
您有几个选择。如果您知道该值永远不会超过某个长度(在这种情况下,为什么列的最大大小大于该长度?)那么您可以将其强制转换为该值,或者告诉 SQL*Plus 列宽使用@987654321 @:
column name format a20
The is much more on formatting in the documentation。但如果它们确实发生,较长的值将被包装(或者如果您在查询中强制转换/截断,数据将会丢失)。
您还可以将所有输出放在一行中,这不是您明确询问但会让事情看起来更整洁的:
set linesize 200
... 或者某个值对于所有列都足够宽。当然,您可以将这两种设置结合起来。单行可能仍会包裹在终端窗口中,因此您可以根据需要将其加宽。
【解决方案3】:
您可以使用 SET NUM[WIDTH] {10 | n}
设置显示数字的默认宽度。
或使用 SET LONG {80 | n}
设置显示 BLOB、BFILE、CLOB、LONG、NCLOB 和 XMLType 值的最大宽度(以字节为单位)。
如果有一个 SET 选项用于显示所有 VARCHAR2 字段的固定宽度,那么问题仍然存在。据我所知,如上所述,您可以使用 COLUMN column_name FORMAT model 仅格式化特定( !) 特定表的列。