为啥我不能修剪 CHAR 类型的列?

Posted

技术标签:

【中文标题】为啥我不能修剪 CHAR 类型的列?【英文标题】:Why can't I trim a column of type CHAR?为什么我不能修剪 CHAR 类型的列? 【发布时间】:2021-02-24 16:49:58 【问题描述】:

如标题所说,如果在我的数据库中创建一个表:

创建表测试 ( 字段 CHAR(20 CHAR) NULL ) 打瞌睡 无压缩 NOCACHE;

插入:

插入测试 (场地) 价值观 ('TEST - 这里是空格-'); 提交;

然后我运行以下语句:

更新测试集 FIELD = TRIM(FIELD); 提交;

但该字段仍然有空格,请注意,如果我将数据类型更改为 varchar2,它可以工作...有人知道为什么吗?

谢谢!

【问题讨论】:

因为 char 数据类型适用于固定长度的字符串,因此它始终具有您在 DDL 中指定的 char 数量。否则使用 varchar2 【参考方案1】:

char 是一个固定宽度的数据类型。 char(20) 的长度始终为 20。如果您尝试插入较短的字符串,它将用空格填充到字段的固定宽度长度。所以

UPDATE TEST SET FIELD = TRIM(FIELD); 

由于trim 函数而删除空格,然后将它们添加回来,因为写入的字符串必须正好是 20 字节长。

实际上,几乎没有使用char 的情况。使用varchar2 几乎总是会更好。 varchar2 是可变长度数据类型,因此数据库无需在末尾附加空格。

【讨论】:

“几乎从不”中的“几乎”是正确的。当我们告诉初学者这一点时,给他们一些例外的例子是有帮助的(表明例外确实很少)。您可以有效地将 char(1) 用于性别/性别列,或使用是/否 ('Y'/'N') 列,或者将 char(2) 用于美国的州代码,例如 CA、NY、FL。这是该列应该始终存储预定长度的字符串的时候;填充应该(几乎)永远不会真正发挥作用。

以上是关于为啥我不能修剪 CHAR 类型的列?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 char** 不能成为 C++ 中以下函数的返回类型?

c++程序 我为啥不能将string类的变量赋给char数组,我按书上打的?

为啥类型提示不能提高此功能的性能?

为啥我不能返回这个向量向量?

c语言char和int可以互相赋值,但指针不能赋值,char *和int *不能直接赋值,为啥呢?谢谢

为啥我不能从 char* 构造 wstring