我知道在编写程序时,在声明字符串,int等时,根据值的类型分配统一的内存量。我也知道许多SQL方言中存在类型varchar - 一种动态数据类型,允许用户确定为列分配的存储量。但是,我很好奇是否有办法改变为特定单元格分配的存储量,无论它们的列数据类型是什么(INTEGER,REAL,TEXT,BLOB等)在任何现代数据库中环境。例如,我不希望为列中创建的每个单元格保留特定数量的存储空间,而是希望每个值只占用它所需的真实空间量 - 无论其真实类型是否预先确定分配。
如果我对此主题的理解似乎被误解或者您对该主题有任何见解,请分享。
答案 0 :(得分:0)
TEXT和BLOB类型通常已经存储为动态存储,非常类似于文件。
VARCHAR和VARBINARY通常是可变宽度,但它取决于DBMS。
可变宽度列会导致行长度不再相同。这增加了一个复杂因素,因为现在DBMS不能使用简单的数学来知道任何行的开始位置 - 如果每行都是X
个字节,那么Nth
行从字节X*N
开始。使用可变长度的行,数学变得不可能。
DBMS可以通过以下两种方式之一来处理:
索引需要更多内存(磁盘和内存)才能保留,但速度很快。行扫描不需要额外的内存,但对于除最小工作负载之外的所有工作负载都非常慢。
除非你处理大的可变长度值,否则使用可变长度类型通常是不值得的。
答案 1 :(得分:0)
数据库供应商会有所不同,所以我可以从Oracle的角度告诉您。 Oracle的VARCHAR2数据类型是一个可变长度的字符串。您必须指定最大大小为32k,但仅存储实际数据。 您也可以在某些限制内更改数据类型。例如,您可以将NUMBER更改为VARCHAR2()。 但是,Oracle CHAR数据类型是固定长度的,因此与VARCHAR2()相比,它具有不同的字符比较语义。
我希望有所帮助。