SUBSTR
会导致更长列?这是怎么回事?
CREATE TABLE t (
long_field VARCHAR2(1024)
);
SELECT
column_name,
data_length
FROM
all_tab_cols
WHERE
table_name = 'T';
COLUMN_NAME | 数据长度 |
---|---|
LONG_FIELD | 1024 |
INSERT INTO t ( long_field ) VALUES ( 'abcdef' );
CREATE TABLE t2
AS
SELECT
substr(long_field, instr(long_field, 'c') + 1) short_field
FROM
t;
SELECT
column_name,
data_length
FROM
all_tab_cols
WHERE
table_name = 'T2';
COLUMN_NAME | 数据长度 |
---|---|
SHORT_FIELD | 4096 |
我使用的是 Oracle 18:
select BANNER
from V$VERSION;
横幅 |
---|
Oracle Database 18c Express 版 18.0.0.0.0 - 生产版 |
SUBSTR
返回 VARCHAR2(4000)
,因为这是函数可以返回的最大长度子字符串。
仅仅因为您的函数
substr(long_field, instr(long_field, 'c') + 1)
返回'def'
并不意味着它会更改数据类型以使其数据长度受数据(即VARCHAR2(3)
)限制,因为SUBSTR
仍然可以(对于其他数据)返回一个 4000 字节的字符串。
如果您想要较短的数据长度,请使用
CAST
:
CREATE TABLE t3 AS
SELECT CAST(
substr(long_field, instr(long_field, 'c') + 1)
AS VARCHAR2(10)
) short_field
FROM t;
那么数据字典将包含:
表名称 | COLUMN_NAME | 数据长度 |
---|---|---|
T3 | SHORT_FIELD | 10 |
T2 | SHORT_FIELD | 4000 |