Sql 是否可以更改数据库中特定单元格的存储分配?

Sql 是否可以更改数据库中特定单元格的存储分配?,sql,database,storage,Sql,Database,Storage,我知道在编写程序时,在声明字符串、int等时,会根据值的类型分配统一的内存量。我还知道在许多SQL方言中都存在varchar类型——一种允许用户确定为列分配的存储量的动态数据类型。然而,我很好奇,在任何现代数据库环境中,是否有一种方法可以改变为特定单元格分配的存储量,而不管其列的数据类型是什么(整数、实数、文本、BLOB等)。例如,我不希望为列中创建的每个单元格保留特定数量的存储空间,而是希望每个值只占用它所需的真正数量的空间,而不考虑其真正类型的预定分配 如果我对这个话题的理解有误,或者你对这

我知道在编写程序时,在声明字符串、int等时,会根据值的类型分配统一的内存量。我还知道在许多SQL方言中都存在varchar类型——一种允许用户确定为列分配的存储量的动态数据类型。然而,我很好奇,在任何现代数据库环境中,是否有一种方法可以改变为特定单元格分配的存储量,而不管其列的数据类型是什么(整数、实数、文本、BLOB等)。例如,我不希望为列中创建的每个单元格保留特定数量的存储空间,而是希望每个值只占用它所需的真正数量的空间,而不考虑其真正类型的预定分配


如果我对这个话题的理解有误,或者你对这个话题有什么见解,请分享

文本和BLOB类型通常已经存储为动态存储,非常类似于文件

VARCHAR和VARBINARY通常是可变宽度的,但它取决于DBMS

可变宽度列导致行的长度不再相同。这增加了一个复杂性,因为现在DBMS无法使用简单的数学来知道任何行的起始位置-如果每行都是
X
字节,那么
N
行从字节
X*N
开始。对于可变长度的行,这种计算变得不可能

DBMS可通过以下两种方式之一处理此问题:

  • 行扫描-要查找第n行,从第一行开始,找出它的长度,跳到最后查找下一行,找出它的长度。。等等
  • 索引:维护一个存储每行长度的表
索引需要保留更多内存(磁盘和ram),但速度很快。行扫描不需要额外的内存,但对于最小的工作负载以外的所有工作负载来说都非常慢


除非您处理的是较大的可变长度值,否则通常不值得使用可变长度类型。

这将因数据库供应商而异,因此我可以从Oracle的角度告诉您。 Oracle的VARCHAR2数据类型是一个可变长度的字符串。您必须指定最大为32k的大小,但只存储实际数据。 您也可以在某些限制内更改数据类型。例如,您可以将NUMBER更改为VARCHAR2()。 但是,Oracle CHAR数据类型是固定长度的,因此与VARCHAR2()相比,它受不同的字符比较语义的约束

我希望这有帮助