【学习笔记】mysql中的数据类型(二)

来源:互联网 发布:mac win7升级win10 编辑:程序博客网 时间:2024/05/21 22:45

本文属于读书笔记,大部分内容摘抄于《高性能MYSQL》,摘抄内容版权属于原作者。

日期和时间类型

mysql可以适用许多类型来保存日期和时间值,例如YEAR和DATE。mysql能存储的最小时间粒度为秒(MariaDB支持微秒级别的时间类型)。但是mysql可以适用微秒级别的粒度进行临时运算。

DATETIME和TIMESTAMP是mysql提供的两种相似的日期累心。对于很多应用程序,他们都能工作,但是在某些场景,一个比另一个工作的好。

DATETIME
这个类型能保存大范围的值,从1001年到9999年,精确度为秒。它把日期和时间封装到格式为YYYYMMDDHHMMSS的整数中,与时区无关。使用8个字节的存储空间。
默认情况下, mysql以一种可排序的、无歧义的格式显示DATETIME值,例如“2008-01-16 22:23:03”。这是ANSI标准定义的时间和日期表示方式。

TIMESTAMP
就像它的名字一样,TIMESTAMP类型保存了从19790年1月1日午夜(格林尼治标准时间)以来的秒数它和UNIX时间戳相同。TIMESTAMP只使用4个字节的存储空间,因此它的范围ibisDATETIME小得多:只能表从1970年到2038年。Mysql提供了FROM_UNIXTIME()函数能把UNIX时间转换为日期,并提供了UNIX_TIMESTAMP()函数把日期转换为iUNIX时间T

如果在多个市区存储或访问数据TIMESTAMP和DATETIME的行为将很不一样。前者提供的值与时区有关,后者则保留文本表示的日期和时间。

插入TIMESTAMP的时候如果没有指定第一个TIMESTAMP列的值,mysql将设置这个列的值为当前时间。在插入一行记录时,Mysql默认也会更新第一个TIMESTAMP列的值。你可以皮遏制任何TIMESTAMP列的插入和更新行为。最后TIMESTAMP列默认为NOT NULL这也和其他的数据类型不一样。

除了特殊行为之外。通常也应该尽量使用TIMESTAMP,因为它比DATETIME空间效率更高。有时候人们会将UNIX时间戳存储为整数值,单着不会带来任何收益。用整数保存时间戳的格式通常不方便处理,所以真心不推荐这样做。

目前mysql没有提供合适的数据类型来存储i秒更小粒度的日期和时间值。但事实可以用自己IDE存储格式:可以适用bigint类型存储微秒级别的时间戳,或者用double存储秒之后的小数部分。

位数据类型

mysql有少数几种存储类型使用紧凑的位存储数据。所有这些位类型,不管底层存储格式和处理方式如何,从技术上来说都是字符串类型。
BIT
在5.0后的版本中,bit 已经不再是TINYINT的同义词,而变成了一个特性完全不同的数据类型。
可以适用BIT列在一列中存储一个或者多个true/false值。 BIT(1)定义一个包含单个位的字段,BIT(2)存储2个位,以此类推。BIT列的最大长度是64个位。
mysql把BIT作为字符串类型,而不是数字类型。当检索BIT(1)的值的时候,结果是衣蛾包涵二进制0或1值的字符串,而不是ASCII码的“0”“1”。然而在上下文的场景中检索时,结果将是位字符串转换成的数字。如果要和另外的值比较,一定要记得这一点。

SET
如果需要保存很多的true/false值,可以考虑合并这些列到一个SET数据类型。它在mysql内部是以一系列打包的位的集合来表示的。这样就笑笑李永乐存储空间,并且mysql有像FIND_IN_SET()和FIELD()这样的函数,方便地砸查询中使用。它的缺点主要是改变列的定义的代价较高:需要ALTER TABLE,这对大表来说是非常昂贵的操作。一般来说也无法在SET列上通过索引查找。

在整数列上进行按位操作
一种代替SET的方法是使用一个整数包装一系列的位。例如,可以吧8个位包装到一个TINYINT中,并且按照未操作来使用。可以在应用中位为每个位定义名称敞亮来简化这个工作。
比起SET这种办法的好处主要在于可以不适用ALTERTABLE改变字段代表的“枚举”值,缺点是查询语句更男鞋,且更难理解。

特殊类型数据

某些类型的数据并不直接与内置一直,TIMESTAMP就是一个例子。另一个例子是IPv4地址。实际上ipv4地址是32位无符号整数而不是字符串。用小数点分割只是方便大家理解,所以应该用无符号整数存储ip地址。mysql提供INET_ATON()和INET_NTOA()函数砸这两种方法之转换。
0 0
原创粉丝点击