前言
为什么会有这个总结,因为在测试Mysql的字符串函数时发现,char
和 varchar
有些不同,网上搜索一番发现了各种char
、varchar
、nvarchar
类型的对比,还有一些奇奇怪怪的这里就不说了,然后我就开始了对这几种类型字符串的测试,接着就悲剧了,测试多次之后发现创建为nvarchar
类型的字段居然是varchar
类型的,再查询官方文档后发现,当前版本(5.7.21)的Mysql根本就没有nvarchar
类型的字段,白白浪费了时间,所以要把Mysql支持的字段列举在这里,方便后面查找使用。
从13年开始工作到现在,数据库主要使用Mysql,关于常使用的字段类型无非 int
、char
、varchar
、blob
、datetime
这几种,工作之前用的最多的是SqlServer,其次就是Oracle和db2了,当时数据库的规模也不大,也没有注意到字段都有哪些类型,基本也是使用上述几种,因为今天在Mysql中的数据类型这栽了跟头,所以查了下官方文档,看看到底都有哪些类型。
支持类型
真是不查不知道,查询后发现当前版本(5.7.21-log MySQL Community Server)支持的数据类型居然有40种,这还是超出我的想象的,以字典排序列举在此方便查找:
bigint
,binary
,bit
,blob
,char
,date
,datetime
,decimal
,double
,enum
,float
,geometry
,geometrycollection
,int
,integer
,json
,linestring
,longblob
,longtext
,mediumblob
,mediumint
,mediumtext
,multilinestring
,multipoint
,multipolygon
,numeric
,point
,polygon
,real
,set
,smallint
,text
,time
,timestamp
,tinyblob
,tinyint
,tibytext
,varbinary
,varchar
,year
。
类型简述
数字类型
BIT[(M)]
比特值类型,M默认为1,范围是[1,64]。TINYINT[(M)] [UNSIGNED] [ZEROFILL]
单字节整数,有符号时范围是[-128,127],无符号时范围是[0,255]。BOOL, BOOLEAN
布尔值类型,需要注意的是创建表时如果指定这两种类型会被自动转为TINYINT类型,0代表false,非0代表true。SMALLINT[(M)] [UNSIGNED] [ZEROFILL]
两字节整数,有符号时范围是[-32768,32767],无符号时范围是[0,65535]。MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]
三字节整数,有符号时范围是[-8388608,8388607],无符号时范围是[0,16777215],这个类型在编程语言中很少见。INT[(M)] [UNSIGNED] [ZEROFILL]
四字节整数,有符号时范围是[-2147483648,2147483647],无符号时范围是[0,4294967295],与INTEGER等价。BIGINT[(M)] [UNSIGNED] [ZEROFILL]
八字节整数,有符号时范围是[-9223372036854775808,9223372036854775807],无符号时范围是[0, 18446744073709551615]。SERIAL
是BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE类型的别名,感觉可以直接拿来做主键。DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]
用于存储精确小数,M表示有效数字位数,范围是[1,65],默认是10,D表示小数点后位数,范围是[0,30],默认是0。NUMERIC[(M[,D])] [UNSIGNED] [ZEROFILL]
是DECIMAL的别名,同样含义的还有DEC[(M[,D])] [UNSIGNED] [ZEROFILL]、FIXED[(M[,D])] [UNSIGNED] [ZEROFILL]。FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
单精度浮点数,M表示有效数字位数,D表示小数点后位数,范围有三部分[-3.402823466E+38,-1.175494351E-38],0,[1.175494351E-38,3.402823466E+38],该类型属于Mysql自己的扩展,依赖硬件和操作系统,指定UNSIGNED表示禁用负数。FLOAT(p) [UNSIGNED] [ZEROFILL]
单精度浮点数,p用来表示精度,取值为0-24等价于没有M和D的FLOAT,取值为25-53等价于没有M和D的DOUBLE。DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
双精度浮点数,表示有效数字位数,D表示小数点后位数,范围有三部分[-1.7976931348623157E+308,-2.2250738585072014E-308],0,[2.2250738585072014E-308, 1.7976931348623157E+308],该类型属于Mysql自己的扩展,依赖硬件和操作系统,指定UNSIGNED表示禁用负数。等价于DOUBLE PRECISION[(M,D)] [UNSIGNED] [ZEROFILL]。- REAL[(M,D)] [UNSIGNED] [ZEROFILL]
一般情况等价于DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL],但如果SQL mode指定了REAL_AS_FLOAT,那么它等价于FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]。
- REAL[(M,D)] [UNSIGNED] [ZEROFILL]
日期和时间类型
DATE
日期类型,展示格式为’YYYY-MM-DD’,支持的范围是[‘1000-01-01’ , ‘9999-12-31’]。DATETIME[(fsp)]
日期时间格式,展示格式为’YYYY-MM-DD hh:mm:ss[.fraction],支持范围是[‘1000-01-01 00:00:00.000000’, ‘9999-12-31 23:59:59.999999’],fsp表示小数位数,默认是0,取值范围是[0,6]。TIMESTAMP[(fsp)]
时间戳,范围是[‘1970-01-01 00:00:01.000000’ UTC, ‘2038-01-19 03:14:07.999999’ UTC],注意到起始秒数从1开始,是因为0被保留用来代表’0000-00-00 00:00:00’了,fsp表示小数位数,默认是0,取值范围是[0,6]。TIME[(fsp)]
时间类型,展示格式为 ‘hh:mm:ss[.fraction]’,支持的范围是[‘-838:59:59.000000’, ‘838:59:59.000000’],fsp表示小数位数,默认是0,取值范围是[0,6]。YEAR[(4)]
代表年份类型,展示格式为’YYYY’,支持的范围是[1901, 2155]和0000。
字符串类型
[NATIONAL] CHAR[(M)] [CHARACTER SET charset_name] [COLLATE collation_name]
固定长度的字符串,M表示字符串最大长度,范围是(0,255],若实际长度不足M,实际串右侧会填充空格,M默认为1。[NATIONAL] VARCHAR(M) [CHARACTER SET charset_name] [COLLATE collation_name]
可变长度的字符串,M表示字符串最大长度,范围是(0, 65535],当存储UTF8编码中文时,一般需要3个字节存储一个汉字。BINARY[(M)]
与CHAR类似,只是存储的是二进制字节串而非普通的字符串。VARBINARY(M)]
与VARCHAR类似,只是存储的是二进制字节串而非普通的字符串。TINYBLOB
字节串,最大长度是255。TINYTEXT [CHARACTER SET charset_name] [COLLATE collation_name]
字符串,最大长度是255。BLOB[(M)]
字节串,最大长度64K-1,若指定M,则会创建一个能存储M字节最小的BLOB类型,比如TINYBLOB。TEXT[(M)] [CHARACTER SET charset_name] [COLLATE collation_name]
字符串,最大长度64K-1,若指定M,则会创建一个能存储M字节最小的BLOB类型,比如TINYTEXT。MEDIUMBLOB
字节串,最大长度16M-1。MEDIUMTEXT [CHARACTER SET charset_name] [COLLATE collation_name]
字符串,最大长度16M-1。LONGBLOB
字节串,最大长度4G-1。LONGTEXT [CHARACTER SET charset_name] [COLLATE collation_name]
字符串,最大长度4G-1。ENUM(‘value1’,’value2’,…) [CHARACTER SET charset_name] [COLLATE collation_name]
枚举值,一个字符串代表一个值,内部通过整数实现,理论上最多可以有65535个不同的值,但实际上这个值小于3000。
- SET(‘value1’,’value2’,…) [CHARACTER SET charset_name] [COLLATE collation_name]
集合,包含一组字符串,其内部还是呈现为一个整数,最大可以有64个不同的字符串对象。
特殊数据类型
Mysql提供了GEOMETRY、POINT、LINESTRING、POLYGON等特殊类型来与OpenGIS类一一对应,用来存储一些图形数据,同时还有MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、GEOMETRYCOLLECTION可以表示这些集合,我感觉我是没机会用这些了,用到了再展开说吧。
Json数据类型
自从Mysql5.7.8之后添加的一种类型,可以存储{“k1”: “val”, “k2”: 110}形式的数据。
常用数据类型大小
类型 | 存储数据范围(只考虑无符号) | 单位 |
---|---|---|
TINYINT |
0-255 | 整数 |
SMALLINT |
0-65535 | 整数 |
MEDIUMINT |
0-16777215 | 整数 |
INT |
0-4294967295 | 整数 |
BIGINT |
0-18446744073709551615 | 整数 |
DATETIME |
1000-01-01 00:00:00.000000 -> 9999-12-31 23:59:59.999999 | 时间点 |
TIMESTAMP |
1970-01-01 00:00:01.000000 UTC -> 2038-01-19 03:14:07.999999 UTC. | 时间点 |
TIME |
-838:59:59.000000 -> 838:59:59.000000 | 时间点 |
CHAR |
0-255 | 字符数 |
VARCHAR |
0-65535 | 字符数 |
BINARY |
0-255 | 字节数 |
VARBINARY |
0-65535 | 字节数 |
TINYBLOB |
255 | 字节数 |
BLOB |
65535(64K-1) | 字节数 |
MEDIUMBLOB |
16777215(16M-1) | 字节数 |
LONGBLOB |
4294967295(4G-1) | 字节数 |