分类: Mysql/postgreSQL
2008-09-05 20:36:49
通过将seq 列设置为相应的初始值,可利用这个方法生成以任意值开始的序列。关于将此序列生成方法用于多个计数器的应用,可参阅第3章。
2.2.3 串列类型
MySQL提供了几种存放字符数据的串类型。串常常用于如下这样的值:
在某种意义上,串实际是一种“通用”类型,因为可用它们来表示任意值。例如,可用串类型来存储二进制数据,如影像或声音,或者存储gzip 的输出结果,即存储压缩数据。对于所有串类型,都要剪裁过长的值使其适合于相应的串类型。但是串类型的取值范围很不同,有的取值范围很小,有的则很大。取 值大的串类型能够存储近4GB 的数据。因此,应该使串足够长以免您的信息被切断(由于受客户机/服务器通信协议的最大块尺寸限制,列
值的最大限额为2 4 MB)。
表2 - 8给出了MySQL定义串值列的类型,以及每种类型的最大尺寸和存储需求。对于可变长的列类型,各行的值所占的存储量是不同的,这取决于实际存放在列中的值的长度。这个长度在表中用L 表示。
L 以外所需的额外字节为存放该值的长度所需的字节数。MySQL通过存储值的内容及其长度来处理可变长度的值。这些额外的字节是无符号整数。请注意,可变长类型的最大长度、此类型所需的额外字节数以及占用相同字节数的无符号整数之间的对应关系。例如,
MEDIUMBLOB 值可能最多22 4 - 1字节长并需要3 个字节记录其结果。3 个字节的整数类型MEDIUMINT 的最大无符号值为22 4 - 1。这并非偶然。
1. CHAR 和VARCHAR 列类型
CHAR 和VARCHAR 是最常使用的串类型。它们是有差异的, CHAR 是定长类型而VARCHAR 是可变长类型。CHAR(M) 列中的每个值占M 个字节;短于M 个字节的值存储时在右边加空格(但右边的空格在检索时去掉)。VARCHAR(M) 列的值只用所必需的字节数来存放(结尾的空格在存储时去掉,这与ANSI SQL 的VARCHAR 值的标准不同),然后再加一个字节记录其长度。如果所需的值在长度上变化不大,则CHAR 是一种比VARCHAR 好的选择,因为处理行长度固定的表比处理行长度可变的表的效率更高。如果所有的值长度相同,由于需要额外的字节来记录值的长度,VARCHAR 实际占用了更多的空间。在MySQL3.23 以前,CHAR 和VARCHAR 列用最大长度为1到255 的M 来定义。从MySQL3.23 开始,CHAR(0) 也是合法的了。在希望定义一个列,但由于尚不知道其长度,所以不想给其分配空间的情况下, CHAR(0) 列作为占位符很有用处。以后可以用ALTE RTABLE 来加宽这个列。如果允许其为NULL,则CHAR(0) 列也可以用来表示o n / o ff 值。这样的列可能取两个值,NULL 和空串。CHAR(0) 列在表中所占的空间很小,只占一位。除少数情况外,在同一个表中不能混用CHAR 和VARCHAR。MySQL根据情况甚至会将列从一种类型转换为另一种类型。这样做的原因如下:
■ 行定长的表比行可变长的表容易处理(其理由请参阅2 . 3节“选择列的类型”)。
■ 表行只在表中所有行为定长类型时是定长的。即使表中只有一列是可变长的,该表的行也是可变长的。
■ 因为在行可变长时定长行的性能优点完全失去。所以为了节省存储空间,在这种情况下最好也将定长列转换为可变长列。这表示,如果表中有VARCHAR 列,那么表中不可能同时有CHAR 列;MySQL会自动地将它们转换为VARCHAR 列。例如创建如下一个表:
BLOB 是一个二进制大对象,是一个可以存储大量数据的容器,可以使其任意大。在MySQL中,BLOB 类型实际是一个类型系列( T I N Y B L O B、B L O B、M E D I U MB L O B、L O N G B L O B),除了在可以存储的最大信息量上不同外(请参阅表2 - 8),它们是等同的。