SQL general: New default column sizes for string and binary data types (Pending)

注意

此行为变更包含在 2025_07 捆绑包中。

有关捆绑包的当前状态,请参阅 捆绑包历史记录

启用此行为变更捆绑包后,:doc:` 字符串和二进制数据类型的默认大小 </sql-reference/data-types-text>` 将更改:

变更前:

文本字符串数据类型 默认大小为 16 MB。

二进制数据类型的默认大小 为 8 MB。

变更后:

文本字符串数据类型的默认大小为 128 MB。

二进制数据类型的默认大小为 64 MB。

在此变更之前,DDL 语句可以显式指定文本字符串列大于 16 MB 和二进制列大于 8 MB 的大小,但当未指定大小时,默认值分别为 16 MB 和 8 MB。

在此行为变更之后,当 DDL 语句未指定大小时,文本字符串列默认大小为 128 MB,二进制列默认大小为 64 MB。因此,INSERT 语句可以向文本字符串列插入大于 16 MB 的值,向二进制列插入大于 8 MB 的值,而无需显式指定更大大小。

备注

此变更不影响 DDL 语句中针对 Apache Iceberg™ 表和用户定义函数 (UDFs) 的操作,因为它们已经使用了较大的默认大小。

该必能适用于 VARCHAR 数据类型的列,以及与 VARCHAR 同义的数据类型列,例如 STRING,但不包括默认大小为 1 的数据类型(包括 CHAR、CHARACTER 和 NCHAR)。该更改还适用于 BINARY 数据类型的列,以及与 BINARY 同义的数据类型列,例如 VARBINARY。

例如,以下语句创建一个未指定列最大大小的表:

CREATE TABLE test_new_default_sizes (
  name VARCHAR,
  profile_image BINARY);
Copy

运行以下查询以显示列的最大大小:

DESCRIBE TABLE test_new_default_sizes
  ->> SELECT "name", "type" FROM $1;
Copy

行为变更之前,查询返回以下输出:

+---------------+-------------------+
| name          | type              |
|---------------+-------------------|
| NAME          | VARCHAR(16777216) |
| PROFILE_IMAGE | BINARY(8388608)   |
+---------------+-------------------+

行为变更后,查询返回以下输出:

+---------------+--------------------+
| name          | type               |
|---------------+--------------------|
| NAME          | VARCHAR(134217728) |
| PROFILE_IMAGE | BINARY(67108864)   |
+---------------+--------------------+

视图和物化视图可以继承较大默认大小

在某些情况下,当您创建使用表达式定义列的视图或物化视图时,即使源表列显式指定较小大小,列也会继承新的默认大小。

例如,创建一个源表,将 VARCHAR 数据类型列的最大大小显式设置为 16777216:

CREATE TABLE test_default_size_source_table (
  id INTEGER,
  description VARCHAR(16777216));
Copy

基于此表创建视图和物化视图,不在列定义中使用表达式:

CREATE VIEW test_default_size_view AS
SELECT id, description FROM test_default_size_source_table;

CREATE MATERIALIZED VIEW test_default_size_mv AS
SELECT id, description FROM test_default_size_source_table;
Copy

运行以下查询以显示列的最大大小:

DESCRIBE VIEW test_default_size_view
  ->> SELECT "name", "type" FROM $1;

DESCRIBE MATERIALIZED VIEW test_default_size_mv
  ->> SELECT "name", "type" FROM $1;
Copy

更改前后,查询均返回如下输出:

+-------------+-------------------+
| name        | type              |
|-------------+-------------------|
| ID          | NUMBER(38,0)      |
| DESCRIPTION | VARCHAR(16777216) |
+-------------+-------------------+

基于源表创建视图和物化视图,并在列定义中使用表达式:

CREATE VIEW test_default_size_view_with_exp AS
SELECT description || RANDSTR(10, 1) AS col
  FROM test_default_size_source_table;

CREATE MATERIALIZED VIEW test_default_size_mv_with_exp AS
SELECT description || RANDSTR(10, 1) AS col
  FROM test_default_size_source_table;
Copy

运行以下查询以显示列的最大大小:

DESCRIBE VIEW test_default_size_view_with_exp
  ->> SELECT "name", "type" FROM $1;

DESCRIBE MATERIALIZED VIEW test_default_size_mv_with_exp
  ->> SELECT "name", "type" FROM $1;
Copy

行为变更前,这些查询返回以下输出:

+------+-------------------+
| name | type              |
|------+-------------------|
| COL  | VARCHAR(16777216) |
+------+-------------------+

行为变更后,这些查询返回以下输出:

+------+--------------------+
| name | type               |
|------+--------------------|
| COL  | VARCHAR(134217728) |
+------+--------------------+

使用 CREATE TABLE AS SELECT 创建的表可以继承较大默认大小

在某些情况下,当您使用 CREATE TABLE AS SELECT (CTAS) 语句创建表,并在列定义中使用表达式时,即使源表列显式指定较小大小,列也会继承新的默认大小。

例如,创建一个源表,显式设置 VARCHAR 和 BINARY 列的最大大小:

CREATE TABLE test_default_size_ctas_source_table (
  small_text VARCHAR(1000),
  medium_text VARCHAR(50000),
  large_text VARCHAR(16777216),
  binary_data BINARY(1000000));
Copy

使用 CTAS 语句从此源表创建表:

CREATE TABLE test_default_size_ctas AS
SELECT small_text,
       medium_text,
       large_text || RANDSTR(10, 1) AS processed_text,
       binary_data
  FROM test_default_size_ctas_source_table;
Copy

在此示例中,processed_text 列的列定义使用了表达式。

运行以下查询以显示列的最大大小:

DESCRIBE TABLE test_default_size_ctas
  ->> SELECT "name", "type" FROM $1;
Copy

行为变更前,查询返回以下输出,processed_text 列显示较小默认大小:

+----------------+-------------------+
| name           | type              |
|----------------+-------------------|
| SMALL_TEXT     | VARCHAR(1000)     |
| MEDIUM_TEXT    | VARCHAR(50000)    |
| PROCESSED_TEXT | VARCHAR(16777216) |
| BINARY_DATA    | BINARY(1000000)   |
+----------------+-------------------+

行为变更后,查询返回以下输出,processed_text 列显示较大默认大小:

+----------------+--------------------+
| name           | type               |
|----------------+--------------------|
| SMALL_TEXT     | VARCHAR(1000)      |
| MEDIUM_TEXT    | VARCHAR(50000)     |
| PROCESSED_TEXT | VARCHAR(134217728) |
| BINARY_DATA    | BINARY(1000000)    |
+----------------+--------------------+

参考:2118

语言: 中文