有没有办法将小于 1 字节的数据保存在数据库中?
is there a way to save data in database smaller than 1 byte?
我有一个大数据(一些 TB),我必须保存在数据库中。
我有一些列可以保存为少量(列 A 有 20 个唯一值 1...20,列 B 有 10 个值等等...)。
有没有一种方法可以将此数据保存在数据库中仅 4 位、5 位...(根据需要)?不像 tiny int 或类似的 1 个字节。
如果那样的话。我应该使用什么数据库引擎(针对这种特定情况)?
如果你真的想要,你可以将多个值打包到一个字节中,并使用虚拟列和位操作来提取单个值:
Oracle 11g R2 架构设置:
CREATE TABLE test (
value CHAR(1 BYTE),
five_bits NUMBER(2,0) GENERATED ALWAYS
AS ( BITAND( ASCII(value), 1+2+4+8+16 ) ) VIRTUAL,
two_bits NUMBER(1,0) GENERATED ALWAYS
AS ( BITAND( ASCII(value), 32+64 ) / 32 ) VIRTUAL,
one_bit NUMBER(1,0) GENERATED ALWAYS
AS ( BITAND( ASCII(value), 128 ) / 128 ) VIRTUAL
);
INSERT INTO test ( value ) VALUES ( CHR( 20 + 2*32 + 0*128 ) );
查询 1:
SELECT * FROM test
| VALUE | FIVE_BITS | TWO_BITS | ONE_BIT |
|-------|-----------|----------|---------|
| T | 20 | 2 | 0 |
但是,使用此解决方法会产生性能开销,我建议节省有限数量的字节可能不值得。
我有一个大数据(一些 TB),我必须保存在数据库中。
我有一些列可以保存为少量(列 A 有 20 个唯一值 1...20,列 B 有 10 个值等等...)。
有没有一种方法可以将此数据保存在数据库中仅 4 位、5 位...(根据需要)?不像 tiny int 或类似的 1 个字节。
如果那样的话。我应该使用什么数据库引擎(针对这种特定情况)?
如果你真的想要,你可以将多个值打包到一个字节中,并使用虚拟列和位操作来提取单个值:
Oracle 11g R2 架构设置:
CREATE TABLE test (
value CHAR(1 BYTE),
five_bits NUMBER(2,0) GENERATED ALWAYS
AS ( BITAND( ASCII(value), 1+2+4+8+16 ) ) VIRTUAL,
two_bits NUMBER(1,0) GENERATED ALWAYS
AS ( BITAND( ASCII(value), 32+64 ) / 32 ) VIRTUAL,
one_bit NUMBER(1,0) GENERATED ALWAYS
AS ( BITAND( ASCII(value), 128 ) / 128 ) VIRTUAL
);
INSERT INTO test ( value ) VALUES ( CHR( 20 + 2*32 + 0*128 ) );
查询 1:
SELECT * FROM test
| VALUE | FIVE_BITS | TWO_BITS | ONE_BIT |
|-------|-----------|----------|---------|
| T | 20 | 2 | 0 |
但是,使用此解决方法会产生性能开销,我建议节省有限数量的字节可能不值得。