每一个常量、变量和参数都有数据类型、它用来指定一定的存储格式、约束和有效范围。MySQL提供了多种数据类型、主要有数值型、字符串类型、日期和时间类型。不同的MySQL版本支持的数据类型可能会稍有不同。
数值类型:
MySQL支持所有标准SQL 中的数值类型、其中包括了严格数值类型、近似数值数据类型、并在此基础上做了一些扩展、增加了三种不同长度的整型。
在整数类型中、按照取值范围和存储方式不同、分为tinyint、smallint、mediumint、int和bigint这五种类型,如果超出类型范围的操作,会发生“Out of range” 错误提示。为了避免此类问题的发生,在选择数据类型的时候要根据应用的实际情况确定其取值范围,最后根据确定的结果去选择数据类型。
对于整型数据,MySQL还支持在类型名称后面的小括号能指定显示宽度,例如 int(5) 表示当数值宽度小于5位的时候在数字前面填满宽度,如果不显示指定宽度则默认为int(11)。一般配合zerofill使用,zerofill就是用“0”填充的意思,也就是在数字位数不够的空间用字符“0”填满。
所有的整数类型都有一个可选属性UNSIGNED(无符号),如果需要在字段里面保存非负数或者需要较大的上限值时,可以用此选项,他的取值范围时正常值得下限取0,上限取原值的2倍,例如tinyint有符号范围是-128~+127,而无符号范围是0~255。如果一个列指定为zreofill,则MySQL自动为该列添加UNSIGNED属性。
整数类型还有一个属性,AUTO_INCREMENT。在需要产生唯一标识符或顺序值时,可以使用此属性,这个属性只能用于整数。ATUO_INCREMENT值一般从1开始,每行增加1。在插入NULL到一个AUTO_INCREMENT列时,MySQL插入一个比该列中当前最大值大1的值。一个表中最多只能有一个AUTO_INCREMENT列。对于任何想要使用AUTO_INCREMENT的列,应该定义为NOT NULL,并定义为PRIMARY KEY 或者为 UNIQUE键。
小数类型,MySQL分为两种方式:浮点数和定点数。浮点数包括float(单精度)和double(双精度),而定点数则只有decimal一种表示。定点数在mysql中以字符串的形式存放,比浮点数更准确,适合用来表示货币等精度高的数据。
浮点数和定点数都可以在类型名称后加(M,D)的方式来表示“(M,D)”表示该值一共显示M位数字(整数位+小数位)其中D位位于小数点后面,M和D又称为精度和标度。需要注意的是浮点数后面跟“(M,D)”的用法是非标准用法,如果要用于数据库的迁移,则最好不要这么使用。float和double在不指定精度时,默认会按照实际的精度(由实际的硬件和操作系统来决定)来显示,而decimal在不指定精度时,默认的整数位为10,默认小数位为0。
浮点数如果不写精度和标度,则会按照实际精度值来显示,如果有精度和标度,则会自动将四舍五入的结果插入,系统不会报错;定点数如果不写精度和标度,则按照默认值decimal(10,0)来进行操作,并且如果数据超越了精度和标度值,系统则会报错。
BIT(位)类型,用于存放字段值,BIT(M)可以用来存放多位二进制数,M范围从1~64,如果不写则默认为1位。对于位字段,直接使用SELECT命令将不会看到结果,可以用bin()
(显示为二进制格式)或者hex()(显示为十六进制格式)函数来进行读取。
日期时间类型:
MySQL中有多种数据类型可以用于日期和时间的表示,不同的版本可能有所差异,这些数据类型主要区别如下:
1.如果用来表示年月日,通常使用DATE来表示。字节:4,最小值:1000-01-01,最大值:9999-12-31
2.如果用来表示年月日时分秒,通常使用DATETIME来表示。字节:8,最小值:1000-01-01 00:00:00,最大值:9999-12-31 23:59:59
3.如果用来表示时分秒,通常使用TIME来表示。字节:4,最小值:-838:59:59,最大值:838:59:59
4.如果需要经常插入或者更新时间为当前系统时间,则通常是用TIMESTAMP来表示。TIMESTAMP值返回后显示为“YYY-MM-DD HH:MM:SS”格式的字符串,显示宽度固定位19个字符,如果想要获得数字值,应在TIMESTAMP列添加“+0”。字节:4,最小值:19700101080001,最大值:2038年的某个时刻
5.如果中表示年份,可以使用YEAR来表示,它比DATE占用更少的空间,YEAR有2位或4位格式的年,默认为4位格式。在4位格式中,允许的值:1901-2155和0000.在2位中,允许的值:70-69,表示1970-2069年。MySQL以YYYY格式显示年YEAR值(从5.5.27开始,2位格式的year已不被支持)。字节:1,最小值:1901,最大值:2155
每个日期时间类型都有一个有效值范围,如果超出这个范围,在默认的SQLMode下,系统会进行错误提示,并将以零值来进行存储。
TIMESTAMP还有一个重要特点,就是和时区相关。当插入日期时,会先转换为本地时区后存放;而从数据库取出时,也同样需要将日期转换为本地时区后显示。这样,两个不同时区的用户看到的同一个日期可能不一样。