MySQL编程-mysql数据类型

     MySQL中数据类型扮演者基础但又非常重要的角色。对数据类型的选择将影响上层应用的性能和后期维护的成本。因此,给数据选择正确的类型至关重要。这里,就简单的总结下MySQL中的数据类型。

     1 日期和时间类型

        MySQL数据库中有五种与日期和时间有关的数据类型,不同的类型在数据库中会占用不同的储存空间。

DATETIME 8字节
DATE 3字节
TIMESTAMP 4字节
YEAR 1字节
TIME 3字节

      DATETIME 是最为详细的数据类型,可以记录日期和精确到秒的时间,记录的时间长度可以从1000-01-01 00:00:00到9999-12-31 23:59:59之间的时间。在数据库中输入的标准格式为:YYYY-MM-DD HH:MM:SS。但是其他的形式如:2011/01/01 00+01+10,或者 20110101000110 等都可以。

    具体用法如下:



 

     DATE 只能记录当前的时间,格式与DATETIME 相似。

     RIMESTAMP 的形式与DATETIME相同,只是记录的时间段较短,只能记录从1970-01-01 00:00:00 到2038-01-19 03:14:07之间的时间,所以占用的空间也较少。

    YEAR 和 TIME 分别用来记录年份和时间,用法和TIMEDATE中相应的部分相同。

    对于可以记录时间的三个变量 TIME DATETIME TIMESTAMP ,MySQL5.6.4版本后开始支持对秒的小树部分。具体语法为: type_name(fsp) type_name是相应的变量类型,fsp表示支持秒的精度,最大为6.。

    2 数字类型

    最为常用的整型变量

数据类型 占用空间(字节) 范围
TINYINT 1 -128~127
SMALLINT 2 -32768~32767
MEDIUMINT 3 -8388608~8388607
INT 4
BIGINT 8

  关于整型数,有一点就是以前总是认为在int后面加长度可以对int的范围进行限制,但其实int(9)这样的书写其实并没有实质性的意义。

 从上面的图就可以看出,虽然规定了int的长度为1 ,但是依然可以添加 数字11。所以后面的长度其实更多的是起到提示作用,如果要限定int的插入类型的长度,还得通过程序进行约束。

    3 浮点型(非精确类型)

     MySQL支持两种浮点型数据类型:单精度的FLOAT 和双精度的 DOUBLE PRECISION(写成DOUBLE也可以)。FOALT 是单精度的变量,占用的空间为4个字节,而DOUBLE PRECISION是双精度变量,占用8个字节的空间。另外,MySQL支持非标准语法:FLOAT(M,D)或者REAL(M,D)或DOUBLE PRECISION(M,D),M表示该值一共的位数,D表示小数点后面的位数。如果小数点超出定义的位数,mysql在储存是会进行四舍五入。

    4 高精度类型

     DECIMAL 和 NUMERIC 是MySQL中的高精度类型,且两种变量被视为同一种类型。高精度的类型在使用时和浮点型相似,同样支持非标准语法。但和浮点型不同的是,DECIMAL 和 NUMERIC 在保存时并不会完全保存数据的内容,而浮点型则是采用近似的方式保存,因而DECIMAL 和NUMERIC 更为精确。

   5 char 和 varchar

     这两种是用来储存字符的数据类型。一般来说,char是用来保存固定长度的字符串,而varchar是用来保存变长字符类型。

     对于char类型,定义时CHAR(N) 中的N 的范围为0~255。在进行存储时,如果存入的字符串长度不到N,mysql会自动在右侧用‘ ’进行补齐。所以说char是用来储存固定长度的字符的数据类型。

     对于varchar类型,定义时VARCHAR(N)中的范围为0~65535。在进行存储是,会在右侧前缀字符串的实际长度,而不是在右侧进行补齐。因而,在某些情况下,varchar(10)占用的储存空间可能会是11个字符的长度,也可能会小于10,而char(10)则一定是10个字符的长度。

     关于char和varchar,最后需要记住的是,不管是VARCHAR(N)还是CHAR(N)中的N都是字符的长度,而不是占用空间的大小。比如在utf8中,一个字符占用的空间为3个字节,所以CHAR(10)占用的空间实际为30个字节大小。但是在big5中,一个字符的大小为2bit,所以CHAR(10)占用的空间就是20。

    6 BINARY 和 VARBINARY 

     BINARY 和 VARBINARY 与CHAR 和 VARCHAR 的用法基本相同,不同的是定义时BINARY(N)和VARBINARY(N)中的N是字节长度,而不是字符长度。所以如果剩余的空间不到插入的字符的大小,则会进行截取,值存入前面的部分。比如定义BINARY(1) 但是存入了'中'(假设字符集为utf8),因为‘中’会占用3个字节,所以并不能全部存,只会存入第一个字节的信息。

    7 BLOB 和 TEXT 

    这两种数据类型是MySQL专门用来储存大数据的数据类型。

     其中 BLOB 是二进制储存,相当于大数据的BINARY ,TEXT 是字符类型,相当于大数据的VARCHAR。

InnoDB储存引擎在这两种类型进行储存时,并不会全部放入数据表中,只会储存前20个字符作为索引。其他的部分将储存在行溢出页中。

    排序的时候也是一样,并不会比较全部的内容,只会比较前1024个字节的长度(可以通过max-sort-length进行设置,默认值为1024)。

    8 MENU 和 SET 类型

     这两个是MySQL中的集合类型,通常用来进行枚举。ENUM 可以枚举65536个元素,而SET最多枚举64个元素。

   由于MySQL并不支持传统的CHECK约束,所以通过ENUM和SET 可以解决一部分问题。比如定义性别时只能有两个选择,就可以通过ENUM和SET 进行约束。

 

 

 

 


 

猜你喜欢

转载自729660130.iteye.com/blog/2245244
今日推荐