【问题标题】: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 显示问题。 VARCHARVARCHAR2 数据类型之间(当前)没有区别——空格填充您保存的数据也不会。只有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 仅格式化特定( !) 特定表的列。

        【讨论】:

          猜你喜欢
          • 2019-02-26
          • 2011-06-17
          • 1970-01-01
          • 2013-08-02
          • 2013-08-14
          • 2019-03-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多