学习笔记--mysql常用数据类型总结

来源:互联网 发布:js多少级技能 编辑:程序博客网 时间:2024/06/04 20:15

Mysql常用数据类型包括:整数类型,实数类型,字符串类型,日期时间类型。

  1. 整数类型
    包括tinyint, smallint, mediumint, int, bigint,对应存储空间分别为8,16,24,32,64位存储空间,长度上来说,tinyint对应java中的byte,8位;smallint对应java中short,16位;int与java中int对应,32位;bigint和java中long对应,64位。需要注意java中的位数是指内存中的空间,而mysql的存储空间是指在磁盘中的占用空间,mysql内存中对整数进行运算时会使用64位的bigint来计算而非指定类型。
    整数类型有可选的unsigned属性,表示不允许负值,可以使正数上限提升1倍。
    还有一种指定宽度的语法,比如int(20),一般没有什么实际意义,它不会限制值的范围,只龟头了mysql一些交互工具显示字符的个数,对于存储和计算来说int(1)和int(20)是没有区别的。

  2. 实数类型
    包括定点数和浮点数,定点数的关键字是decimal(m, n),m表示总位数,n表示小数点后的位数,在mysql 5.0以后的版本中,decimal的运算由mysql服务实现,为高精度运算。decimal的存储格式为数字字符串,最多支持65个数字。
    浮点数包括float和double,分别占用4个和8个字节(和java中的float以及double相同),mysql内部运算统一使用double。
    可以看出,decimal无论运算还是存储,代价都比较高,通常只在对运算结果精度有很高要求时才使用,比如计算钱的时候。但通常计算钱的时候,比如分,可以先乘以100,在使用bigint存储,这样比使用decimal更好。所以,decimal一般不怎么用。

  3. 字符串类型
    mysql字符串类型包括varchar和char, 定义varchar和char都需要指定长度。不同的是varchar在存储时只存储需要的长度(需要一个额外的字节来存储varchar的长度),而char则固定占用指定的长度。
    显然varchar更节省空间,但由于是变长的,update的时候需要额外的工作。通常只在一些长度相对固定,变化频繁的场景使用char,其余场景一般选择varchar。
    注意一点,虽然varchar定义时指定的长度不影响最终存储需要的空间,但会占用更大的内存空间(分配内存是按这个长度分配的),所以也不宜过大。

  4. Text和Blob
    这俩为存储大块数据而设计的,Text为字符串方式存储,有排序规则和字符集,包括timytext, smalltext, text, mediumtext, longtext。Blob为二进制方式存储,没有排序规则和字符集,包括tinyblob, smallblob, blob, mediumblob, longblob。与其他类型不同,mysql会把blob和text当成独立的对象来处理,存储引擎也会对text和blob做特殊处理,比如使用外部存储区域存储大对象,而行内只存储一个指针。

  5. 枚举enum
    枚举是一个预定义集合,比如一列字符串,只有固定的几个值,通常就需要将其定义为枚举,比如enum(‘string1’, ‘string2’, ‘string3’)。这样在存储时就只需要存储整数1,2,3表示哪个枚举字符串,比直接存储字符串大大的减少了存储空间。
    注意使用枚举后排序的依据就是枚举中的位置,而不是字符串排序的结果。

  6. 日期和时间类型
    mysql提供datetime和timestamp两种时间类型,底层都是整数,datatime把时间封装到YYYYMMDDHHMMSS整数中,占8个字节,可以从1001年表示到9999年
    timestamp与UNIX时间戳相同,存储从格林尼治时间1970-1-1 00:00:00以来的秒数,占用4个字节空间,范围是1970年到2038年的时间,timestamp的显示值依赖于时区, mysql服务器,操作系统和客户端连接都有时区设置。
    timestamp占用空间更小,对时区也比较好处理,一般选择timestamp

0 0