【问题标题】:How to get the data/value size from CHAR column of Oracle Database?如何从 Oracle 数据库的 CHAR 列中获取数据/值大小?
【发布时间】:2019-08-29 12:37:26
【问题描述】:

我在 Oracle DB 中有一个表,其中列 CHAR(11)。

我已将值 'abcd ' 插入其中。 (注意abcd后面有一个空格)

当我执行 LENGTH(column) 时 - 它返回 11 而不是 5。

如何获取数据大小而不是列大小?

之所以需要它,是因为我正在从 table1 读取值具有 CHAR 数据类型并将数据插入到 table2 具有 VARCHAR 数据类型

所以在这种情况下,它会将 'abcd '(abcd 后跟 7 个空格) 添加到 table2 而不是 'abcd' (有单个空格)。

如何避免这种情况?如果我可以从 CHAR 列中获取数据大小,那么我可以做到。

请告诉我如何实现?

【问题讨论】:

  • 你能添加空格值并期望它们算作长度吗?
  • JFYI:根据 Tom Kyte 的说法,没有理由使用 CHAR 而不是 VARCHAR2。在这里阅读:asktom.oracle.com/pls/asktom/…,
  • @ThorstenKettner TRIM 使用默认选项将摆脱前导空格,并且大多数时候不会给出预期的结果。您要么想要RTRIM,要么使用TRIM 并指定TRIM( TRAILING ' ' FROM column_name )
  • @MT0:是的,抱歉,当我阅读您的回答时,我已经删除了我在 TRIM 上的误导性评论 :-)

标签: database oracle


【解决方案1】:

如果您想要一个可变长度的列,请使用VARCHAR2 而不是CHAR


CHAR 列是一个固定长度的字符串,将用空格 (ASCII 32) 字符进行右填充。因此,如果您想要 CHAR(11) 的长度,那么无论您尝试插入 1 个字符还是 11 个字符的字符串,它将始终为 11 个字符,因为它将被正确填充。

如果您想忽略正确的填充,请在测量长度之前RTRIM 字符串(但是这也会删除任何有意的尾随空格以及无意的空格)。

SELECT LENGTH( RTRIM( column_name ) ) FROM table_name

例如:

Oracle 设置

CREATE TABLE table_name ( column_name CHAR(11) );

INSERT INTO table_name ( column_name )
  SELECT 'abcd' FROM DUAL UNION ALL
  SELECT ' abc' FROM DUAL;

查询

SELECT LENGTH( column_name ),
       LENGTH( TRIM( column_name ) ),
       LENGTH( RTRIM( column_name ) )
FROM   table_name

输出

长度(COLUMN_NAME)|长度(修剪(COLUMN_NAME))|长度(RTRIM(COLUMN_NAME)) ------------------: | ------------------------------------: | -------------------------: 11 | 4 | 4 11 | 3 | 4

db小提琴here

如您所见,LENGTH 本身就包含了整个填充字符串。使用 TRIM 会给出错误的答案,因为它还会删除前导空格和尾随空格。 RTRIM 给出了正确的长度。

【讨论】:

    【解决方案2】:

    请尝试使用 trim 。

    从表中选择修剪(列名);

    【讨论】:

    • 当列为' abc'时会发生什么?
    • 使用 ltrim 来减少空间,使用 rtrim 来减少右侧空间
    猜你喜欢
    • 1970-01-01
    • 2022-07-21
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    相关资源
    最近更新 更多