MySQL支持的数据类型
jopen
10年前
数值类型
MySQL中包括严格数据类型(INTEGER,SAMLLINT,DECIMAL,NUMERIC),以及近似数据类型(FLOAT,REAL,DOUBLE),扩展后增加了TINYINT,MEDIUMINT和BIGINT这三种长度不同的整形,并增加了BIT类型,用来存放位数据。
在整数类型中,按照取值范围和存储方式不同,可以分为tinyint,smallint,mediumint,int和bigint这5个类型。
对于整形数据,MySQL支持在类型名称后面的小括号内指定显示宽度,例如int(5)表示当数值宽度小于5位的时候在数字前面填满宽度,如果不显示指定宽度则默认为int(11)。但是,对大多数应用来说这是没有意义的,它不会限制值的合法范围,只是规定了MySQL的一些交互工具用来显示字符的个数。对于存储和计算来说,INT(1)和INT(20)是相同的。zerofill是用‘0’填充的意思,在数字位数不够的空间用字符‘0’填满。
浮点数存在误差问题;对货币等对精度敏感的数据,应该用定点数表示或存储;在编程中,如果用到浮点数,要特别注意误差问题,并尽量避免做浮点数比较;要注意浮点数中一些特殊值的处理。
日期时间类型
Mysql中有多种数据类型可以用于日期和时间的表示。
这些数据类型的主要区别如下:
(1)如果要用来表示年月日,通常用DATE来表示;
(2)如果要用来表示年月日时分秒,通常用DATETIME表示;
(3)如果只用来表示时分秒,通常用TIME来表示;
(4)如果需要进场插入或者更新日期为当前系统时间,则通常使用TIMESTAMP来表示。
(5)如果只是年份,可以使用YEAR来表示。
不同日期类型零值的表示如下所示:
数据类型 | 零值表示 |
DATETIME | 0000-00-00 00:00:00 |
TIME | 00:00:00 |
DATE | 0000-00-00 |
TIMESTAMP | 00000000000000 |
YEAR | 0000 |
MySQL提供了FROM_UNIXTIME()函数把Unix时间戳转换为日期,并提供了UNIX_TIMESTAMP()函数把日期转换为Unix时间戳。
在存储数据的时候将整个时间存在一个字段中,采用datetime类型;也可能采用将日期和时间分离,即一个字段存储date,一个字段存储时间time。无论怎么存储,在实际应用中,很可能会出现包含“时间段”类型的查询,比如一个访问记录数据库,需要统计每天的访问数量,这个每天就是一个时间段。
下面介绍MySql查询时间段的两种常见方法,其他数据库也可以类似实现。
方法一:传统方式,即指定开始时间和结束时间,用"between”或者"<",">"来建立条件。
比如查询2010年3月1日到2010年3月2日的数据条数,则可以使用
select count(*) from sometable where datetimecolumn>='2010-03-01 00:00:00' and datetimecolumn<'2010-03-02 00:00:00
但是,这种方法由于时间不是整数型数据,所以在比较的时候效率较低,所以如果数据量较大,可以将时间转换为整数型的UNIX时间戳。
</div> 方法二:UNIX时间戳,每个时间对应了一个唯一的UNIX时间戳,该时间戳是从'1970-01-01 00:00:00' 为0开始计时,每秒增加1。MySql内置了传统时间和UNIX时间的互换函数,分别为UNIX_TIMESTAMP(datetime)和 FROM_UNIXTIME(unixtime)。
比如运行 返回1267372800。</div>
SELECT UNIX_TIMESTAMP('2010-03-01 00:00:00')
运行 返回'2010-03-01 00:00:00'</div>
SELECT FROM_UNIXTIME(1267372800)
于是,我们可以将时间字段里的数据替换为整型的UNIX时间,这样,比较时间就成为整数比较了,建立索引后能大大提高效率。
在查询的时候,需要把起点时间和结尾时间分别转换为UNIX时间再进行比较,如