标签(空格分隔): 高性能MySQL 第四章 schema与数据类型 MySQL位数据类型
以InnoDB为例说明
InnoDB为每个BIT列使用一个足够存储的最小整数类型来存放,所以不能节省存储空间。MySQL把BIT当作字符串类型,而不是数字类型。但在数字上下文场景中,会转换成数字。
例:mysql> CREATE TABLE bittest(a bit(8)); mysql> INSERT INTO bittest VALUES(b'00111001'); mysql> SELECT a, a + 0 FROM bittest;
+------+-------+ | a | a + 0 | +------|-------+ | 9 | 57 | +------+-------+
SET
如果需要存储很多true/false值,可以考虑合并这些列到一个SET数据类型,它在MySQL内部是以一系列打包的集合来表示的。这样就有=有效地利用了存储空间,并且MySQL有像FIND_IN_SET()和FIELD()这样的函数,方便地在查询中使用。缺点是改变列的定义需要ALTER TABLE,代价较高。一 般来说,也无法在set列上通过索引查找。在整数列上进行按位操作
一种替代SET的方案是使用一个整数包装一系列的位,如把8个位包装到时TINYINT中,并且按照位操作来使用。在代码里存取对应关系,缺点是难以理解,如第五个bit设为true表示什么?