MySQL--数据类型
1.数值类型
- 对于整型数据,MYSQL支持在类型名称后面的小括号内指定显示宽度,例如 INT(5)表示当实质宽度小于5位的时候在数字前面填满宽度。
- 如果不显式指定宽度则默认为INT(11)。一般配合 ZEROFILL使用(填充0)。
- 如果插入大于宽度限制的值,还是按照类型的实际精度进行保存,不会做截断处理。
- 如果一个列指定为 ZEROFILL,则MYSQL自动为该列添加 UNSIGNED 属性。
- 整数类型还有一个属性:AUTO_INCREMENT。在需要产生唯一标识符或顺序值时,可利用此属性,这个属性只用于整数类型。一个表中最多只能还有一个AUTO_INCREMENT列,对于任何想要使用AUTO_INCREMENT的列,应该定义为NOT NULL,并定义为PRIMARY KEY或定义为UNIQUE键。
- 对于小数的表示,MYSQL分为两种方式:浮点数和定点数。
- 浮点数包括FLOAT和DOUBLE。而定点数则只有DECIMAL一种表示。定点数在MYSQL内部以字符串形式存放,比浮点数更精确,适合用来表示货币等精度高的数据。
- 浮点数和定点数都可以用类型名称加 (M, D) 的方式来进行表示。表示该值一共显示M位数字(整数位+小数位),其中D位位于小数点后面,M和D又称为精度和标度。 FLOAT(7, 4) -> -999.9999
- (M, D) 用法是非标准用法,不利于数据库迁移。
- FLOAT 和 DOUBLE在不指定精度时,默认会按照实际的精度来显示(由实际的硬件和操作系统决定)。
- DECIMAL在不指定精度时,默认的整数位为10,默认的小数位为0。
- 浮点数如果不写精度和标度,则会按照实际精度值显示,如果有精度和标度则会自动将四舍五入后的结果插入,系统不会报错
- 定点数如果不写精度和标度,则按照默认值DECIMAL(10, 0)来进行操作,并且如果数据超越了精度和标度值,系统则会报错。
- 位类型,用于存放字段值,BIT(M)可以用来存放多位二进制数,M范围从1~64,如果不写则默认为1位。
- 对于位字段,直接使用SELECT命令将不会看到结果,可以用 BIN()(显示为二进制格式)或者HEX()(显示为十六进制格式)函数进行读取。
2.日起时间类型
- DATE通常用来表示年月日
- DATETIME通常用来表示年月日时分秒
- TIME通常只用来表示时分秒
- 如果需要经常插入或者更新日期为当前系统时间,则通常使用TIMESTAMP来表示。TIMESTAMP值返回后显示为“YYYY-MM-DD HH:MM:SS”格式的字符串,显示宽度固定为19个字符。如果想要获得数字值,应在TIMESTAMP列添加 “+0”
- 如果只是表示年份,可以用YEAR来表示,他比DATE占用更少的空间。YEAR有2位(不再支持)或4位格式的年。默认是4位格式(1901~2155)
- 表中第一个TIMESTAMP类型系统会自动创建默认值CURRENT_TIMESTAMP(系统日期),如果还有其他的TIMESTAMP类型默认设置为0值。且不能修改默认值。
- TIMESTAMP和时区相关,存读取数据库时都会转换到当前时区的时间
- 查看当前时区
SHOW VARIABLES LIKE 'time_zone' - 修改时区为东9区
SET time_zone='+9:00' - TIMESTAMP支持的时间范围较小(19700202080001到2038年的某个时间),而DATETIME是从1000-01-01 00:00:00 到 9999-12-31 23:59:59,范围更大
- 表中的第一个TIMESTAMP列自动设置为系统时间。如果在一个TIMESTAMP列中插入NULL,则该列值将自动设置为当前的日期和时间。再插入或更新一行但不明确给TIMESTAMP列赋值时也会自动设置该列的值为当前的日期和时间,当插入的值超出取值范围是,MYSQL认为该值溢出,使用 ‘0000-00-00 00:00:00’ 进行填补
- TIMESTAMP的插入和查询都受当地时区的影响,更能反映出实际的日期。而DATETIME则只能反映出插入时当地的时区,其他时区的人查看数据必然会有误差
- TIMESTAMP的属性受MYSQL版本和服务器SQLNODE的影响很大
- 时间的插入允许不严格的语法,即任何标点符号都可以用作日期部分或时间部分之间的间隔符
3.字符串类型
- CHAR和VARCHAR都用来保存MYSSQL中较短的字符串
- CHAR列的长度固定为创建表时声明的长度,长度可以从0~255的任何值;而VARCHAR列中的值为可变长字符串,长度可以指定为0~255之间的值。在检索的时候,CHAR列删除了尾部的空格,而VARCHAR则保留这些空格
- BINARY 和 VARBINAR 类似于CHAR和VARCHAR,不同的是他们包含二进制字符串而不包含非二进制字符串
4.ENUM类型
- 取值范围需要在创建表时通过枚举方式显示指定,对1~255个成员的枚举需要一个字节存储,对于255~65535个成员,需要2个字节存储。最多允许有65535个成员。
- ENUM是忽略大小写的
- 插入不在ENUM指定范围内的值时,并不返回警告,而是插入ENUM的第一个值
- ENUM类型只允许从值集合中选取单个值,而不能一次选取多个值
5.SET类型
- SET和ENUM类型类似,也是一个字符串对象,里面可以包含0~64个成员,根据成员的不同,存储上也有所不同。
1~8成员的集合,占1个字节
9~16成员的集合,占2个字节
17~24成员的集合,占3个字节
25~32成员的集合,占4个字节
33~64成员的集合,占8个字节 - SET和ENUM除了存储之外,最主要的区别在于SET类型一次可以选取多个成员,而ENUM只能选取一个。
- SET类型可以从允许值集合中选择任意一个或多个元素进行组合,所以对输入的值只要是在允许值的组合范围内,都可以正确的注入到SET类型的列中