MySQL支持几种类别的SQL数据类型:数字类型,日期和时间类型,字符串(字符和字节)类型,空间类型和JSON数据类型。
(以下数据类型基于innodb引擎)
一、数值类型
MySQL支持所有标准SQL数值数据类型。
1.整型
整型的写法在mysql官方文档中提到,标准写法是INT(M),M代表最大显示宽度。注意M多大与空间占用无关,只是显式设置出来的最大宽度。ZEROFILL 关键字会填充0到最大宽度,并且加了这个关键字后,类型会自动变为 unsigned 类型。
2.浮点型
这里提一下浮点型的储存格式:
float:1bit(符号位)+8bits(指数位)+23bits(尾数位)double:1bit(符号位)+ 11bits(指数位)+ 52bits(尾数位)
所谓浮点数的精度,即其尾数位的长度,float最大精度23,double最大精度52.
对于浮点型,SQL标准是在括号中中指定精度;即FLOAT(p)。从0到23的精度导致4字节单精度FLOAT列。从24到53的精度导致8字节的双精度DOUBLE列。即FLOAT(0-23)为float型,FLOAT(24-53)为double型。
此外,MySQL允许使用非标准语法:FLOAT(M,D)或DOUBLE(M,D)。这是方便显示的语法,M表示显示的最大位数,D表示小数点后显示最大位数。在此,(M,D)表示总共可以存储多达M位的值,其中D位可以在小数点后。例如,显示为FLOAT(7,4)的列显示为-999.9999。
MySQL在存储值时执行四舍五入,因此,如果将999.00009插入FLOAT(7,4)列,则近似结果为999.0001。
并且,官方指出,非标准的语法将会取消,所以建议使用第一种标准SQL语法。
3.定点型:
SQL中定点型有DECIMAL和NUMERIC类型,用于存储精确数值的数据值。当保留精确度很重要时,例如使用货币数据,则可以使用这些类型。在MySQL中,NUMERIC被实现为DECIMAL。
写法是DECIMAL(M,D),M表示最大位数,D表示小数位数。例如DECIMAL(5,2),能够存储任何具有五位数字和两位小数的值,因此可以存储的值的范围是-999.99到999.99。定点型数据最大位数为65位。当D不指定时默认为0,M不指定时默认为10。
4.BIT型:
BIT数据类型用于存储位值。 BIT(M)类型可以存储M位的值。
M的范围可以从1到64。要指定位值,可以使用b'value'表示法。值是使用零和一写入的二进制值。例如,b'111'和b'10000000'分别代表7和128。如果为BIT(M)列分配的值小于M位长,则该值将在左侧填充零。
溢出处理
当存储的值超出了指定数据类型的范围时,根据SQL的模式有不同的结果。
如果SQL为严格模式,那么数据插入将会导致报错,插入失败;
如果未启动限制模式,那么将会将数据自动裁剪到离得最近的端插入。比如往TINYINT插入200,那么实际结果会裁剪为127插入。
二、时间日期类型
1、类型
一共五种类型:
- DATE:占用3字节,格式是YYYY-MM-DD,范围从'1000-01-01'至'9999-12-31'。
- DATETIME(fps):日期和时间的组合,占用8字节,范围是'1000-01-01 00:00:00.000000' 至 '9999-12-31 23:59:59.999999'。
- TIMESTAMP(fps):时间戳记,占用4字节。范围是'1970-01-01 00:00:01'UTC到'2038-01-19 03:14:07'UTC。 TIMESTAMP值存储为从纪元('1970-01-01 00:00:00'UTC)起的秒数。
- TIME(fps):占用3字节,范围是“ -838:59:59.000000”至“ 838:59:59.000000”。除了可以表示一天的时间,还常用来表示时间间隔,所以有负数。
- YEAR(m):占用1字节。可以显式的指定宽度m,m为4位,范围从1901-2155。m为2,数据范围则是0-99,对应的年份范围是1970-2070,其中0-69表示2000-2069年。
每个时间类型有一个有效值范围和一个"零"值,当指定不合法的值时使用"零"值代替。零值即用0充满对应格式,如YEAR的0即为 0000
时间日期可以用字符串给出,类似上述例子,也可以直接用数字给出,同时还支持省略冒号的写法。最标准的格式是使用字符串:"YYYY-MM-DD HH:MM:SS"。年份可以只写两位数,此时系统会自动判断离当前年份最近的是19xx还是20xx来进行选择,一般建议写全。
2、自动更新时间戳
对于 TIMESTAMP 和 DATETIME 类型,可以使用 CURRENT_TIMESTAMP 自动初始化,初始化为当前时间。
create table t (create_time datetime default CURRENT_TIMESTAMP);
并且可以设置该在表被更新时自动更新时间为修改的时间(只有表确实被更新时才会有效,如果执行了update但表实际未被修改也不生效):
create table t (create_time datetime on UPDATE CURRENT_TIMESTAMP);
3、相关函数
-
NOW、CURRENT_TIMESTAMP、SYSDATE
NOW等于CURRENT_TIMESTAMP,它们返回的是开始执行该sql语句的时间。
SYSDATE返回的是执行该函数的当前时间,所以它更加精确一点。
-
DATE_ADD、DATE_SUB
时间的加减需要使用函数
-
DATE_FORMAT
对时间进行格式化输出
三、字符串类型
数据库创建时都要指定字符集(编码),和排序规则。mysql支持的字符集在 information_schema 数据库中的 CHARACTER_SET 表中。排序规则在 COLLATIONS 表中。
一般 _ci (case insensitive) 表示大小写不敏感,_cs (case sensitive) 表示大小写敏感,_bin表示进行二进制的比较。
字符串数据类型包括CHAR,VARCHAR,BINARY,VARBINARY,BLOB,TEXT,ENUM和SET。
字符和字节,英文编码中一字符长度即一字节,中文编码一字符可能多个字节。上述的最大容量都是以字节为单位,但char型的数据用于指定大小的m,单位为字符,因此CHAR(m)中m最大可能达不到255。
CHAR(m) 若存入字符数小于M,则在后面用空格补齐,查询时再将空格去掉。所以char类型存储的字符串末尾不能有空格。CHAR(m) 占用固定长度,VARCHAR长度为实际数据长度加前缀长度。
非二进制字符还可以指定字符集。在语句后加上[CHARACTER SET charset_name],指定字符集。
四、空间数据
这种数据类型可以用来描述世界上任何物体的空间位置。空间数据类型归到GEOMETRY类,GEOMETRY又有为POINT、LINESTRING、POLYGON、CURVE、SURFACE等子类,只有POINT、LINESTRING、POLYGON三个类是可实例化的类,其他都是抽象类不可实例化。
POINT点,包含x,y值,可以在地图上表示一个具体位置;LINESTRING线,多个点联合成线,可以表示河流、街道;POLYGON多边形,可以表示区域。更多内容可以看官网文档 Spatial Data Types.