广

MYSQL

  • MYSQL
  • MSSQL
  • Redis
  • MongoDB
  • oracle数据库
  • 数据管理

    Mysql入门系列:MySQL的列类型(2)

    2018-04-16 10:56:59 次阅读 稿源:互联网
    零七网广告
    全网推广平台,软文发布

      序列不从1开始的另一个原因从技术的角度来说可能不值一提。例如,在分配会员号时,序列号不要从1开始,以免出现关于谁是第一号的政治争论。

      (4) 不用AUTO_INCREMENT 生成序列生成序列号的另一个方法根本就不需要使用AUTO_INCREMENT 列。它利用取一个参数的L A S T _ INSERT_ID( ) 函数的变量来生成序列号。(这种形式在MySQL3.22.9. 中引入)如果利用L A S T _ INSERT_ID(expr) 来插入或更新一个列, 则下一次不用参数调用L A S T _ INSERT_ID( ) 时,将返回expr 的值。换句话说,就像由AUTO_INCREMENT 机制生成的那样对expr 进行处理。这样使得能生成一个序列号,然后可在以后的客户会话中利用它,用不着取受其他客户机影响的值。利用这种策略的一种方法是创建一个包含一个值的单行表,该值在想得到序列中下一个值时进行更新。例如,可创建如下的表:

      

      上面的语句创建了表seq_table 并用包含seq 值0 的行对其进行初始化。可利用这个表产生下一个序列号,如下所示:

      

      该语句取出seq 列的当前值并对其加1,产生序列中的下一个值。利用L A S T _ INSERT _ID(seq + 1) 生成新值使它就像一个AUTO_INCREMENT 值一样,而且此值可在以后的语句中通过调用无参数的L A S T _ INSERT_ID( ) 来取出。即使某个其他客户机同时生成了另一个序列号,上述作用也不会改变,因为L A S T _ INSERT_ID( ) 是客户机专用的。如果希望生成增量不是1的编号序列或负增量的编号序列,也可以利用这个方法。例如,下面两个语句可以用来分别生成一个增量为100 的编号序列和一个负的编号序列:

      

      通过将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根据情况甚至会将列从一种类型转换为另一种类型。这样做的原因如下:

    零七网部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与零七网进行文章共享合作。

    零七网广告
    零七网广告
    零七网广告
    零七网广告