位数据类型
这是相当令人费解的所以我们认为应该谨慎使用BIT 类型对于大部分应用最好避免使用这种类型
如果想在一个bit 的存储空间中存储一个true/false 值另一个方法是创建一个可以为空的CHAR() 列该列可以保存空值(NULL)或者长度为零的字符串(空字符串)
SET
如果需要保存很多true/false 值可以考虑合并这些列到一个SET 数据类型它在MySQL 内部是以一系列打包的位的集合来表示的这样就有效地利用了存储空间并且MySQL 有像FIND_IN_SET() 和FIELD() 这样的函数方便地在查询中使用它的主要缺点是改变列的定义的代价较高需要ALTER TABLE这对大表来说是非常昂贵的操作(但是本章的后面给出了解决办法)一般来说也无法在SET 列上通过索引查找
在整数列上进行按位操作
一种替代SET 的方式是使用一个整数包装一系列的位例如可以把 个位包装到一个TINYINT 中并且按位操作来使用可以在应用中为每个位定义名称常量来简化这个工作
比起SET这种办法主要的好处在于可以不使用ALTER TABLE 改变字段代表的枚举值缺点是查询语句更难写并且更难理解(当第 个bit 位被设置时是什么意思?)一些人非常适应这种方式也有一些人不适应所以是否采用这种技术取决于个人的偏好
一个包装位的应用的例子是保存权限的访问控制列表(ACL)每个位或者SET 元素代表一个值例如CAN_READCAN_WRITE或者CAN_DELETE如果使用SET 列可以让MySQL 在列定义里存储位到值的映射关系如果使用整数列则可以在应用代码里存储这个对应关系这是使用SET 列时的查询
这里我们使用MySQL变量来定义值但是也可以在代码里使用常量来代替
返回目录高性能MySQL
编辑推荐
ASPNET MVC 框架揭秘
Oracle索引技术
ASP NET开发培训视频教程
数据仓库与数据挖掘培训视频教程