MySQL提供了多种数据类型,主要包括:数值型、字符串类型、日期和时间类型JSON类型。
整型类型 | 字节 | 最小值 | 最大值 |
---|---|---|---|
TINYINT | 1 | 有符号 -128 无符号 0 | 有符号 127 无符号 255 |
SMALLINT | 2 | 有符号 -32768 无符号 0 | 有符号 32767 无符号 65535 |
MEDIUMINT | 3 | 有符号 -8388608 无符号 0 | 有符号 8388607 无符号 16777215 |
INT、INTEGER | 4 | 有符号 -2147483648 无符号 0 | 有符号 2147483647 无符号 4294967295 |
BEGINT | 8 | 有符号 -9223372036854775808 无符号 0 | 有符号 9223372036854775807 无符号 18446744073709551615 |
浮点数类型 | 字节 | 最小值 | 最大值 |
---|---|---|---|
FLOAT | 4 | ±1.175494351E-38 | ±3.402823466E+38 |
DOUBLE | 8 | ±2.2250738585072014E-308 | ±1.7976931348623157E+308 |
定点数类型 | 字节 | 描述 |
---|---|---|
DECIMAL(M,D) | M+2 | 最大取值范围与DOUBLE相同,给定DECIMAL的有效取值范围由M和D决定 |
M:指的是整数和小数所能存的最多的位数 D:指的是小数数字的位数,即M-D就是整数的位数 |
位类型 | 字节 | 最小值 | 最大值 |
---|---|---|---|
BIT(M) | 1~8 | BIT(1) | BIT(64) |
日期和时间类型 | 字节 | 最小值 | 最大值 | 零值表示 |
---|---|---|---|---|
DATE | 4 | 1000-01-01 | 9999-12-31 | 0000-00-00 00:00:00 |
DATETIME | 8 | 1000-01-01 00:00:00 | 9999-12-31 23:59:59 | 0000-00-00 |
TIMESTAMP | 4 | 19700101080001 | 2038年的某个时刻 | 00000000000000 |
TIME | 3 | -838:59:59 | 838:59:59 | 00:00:00 |
YEAR | 1 | 1901 | 2155 | 0000 |
注意:每种日期时间类型都有一个有效值范围,如果超出这个范围,在默认的SQLMode下,系统会进行错误提示,并将以零值来进行存储。
1、MySQL提供了多种对字符数据的存储类型,不同的版本可能有所差异,以5.7版本为例,MySQL包括了CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET等多种字符串类型,如下表所示:
日期和时间类型 | 字节 | 描述及存储需求 |
---|---|---|
CHAR(M) | M | M为0~255之间的整数 |
VARCHAR(M) | M为0~65535之间的整数,值的长度+1个字节 | |
TINYBLOB | 允许长度0~255字节,值的长度+1个字节 | |
BLOB | 允许长度0~65535字节,值的长度+2个字节 | |
MEDIUMBLOB | 允许长度0~167772150字节,值的长度+3个字节 | |
LONGBLOB | 允许长度0~4294967295字节,值的长度+4个字节 | |
TINYTEXT | 允许长度0~255字节,值的长度+2个字节 | |
TEXT | 允许长度0~65535字节,值的长度+2个字节 | |
MEDIUMTEXT | 允许长度0~167772150字节,值的长度+3个字节 | |
LONGTEXT | 允许长度0~4294967295字节,值的长度+4个字节 | |
VARBINARY(M) | 允许长度0~M个字节的变长字节字符串,值的长度+1个字节 | |
BINARY(M) | M | 允许长度0~M个字节的定长字节字符串 |
2、CHAR和VARCHAR类型:
两者的主要区别在于存储方式不同:
CHAR列的长度固定为创建表时声明的长度,而VARCHAR列中的值为可变长字符串;
在检查的时候,CHAR列删除尾部的空格,而VARCHAR则保留这些空格
create table vc( v varchar(4), c char(4) )Engine=Innodb default charset=utf8; insert into vc values("ab ","ab "); select length(v),LENGTH(c) from vc; select concat(v,"+"),concat(c,"+") from vc;
3、BINARY和VARBINARY类型:
BINARYT和VARBINARY类似于CHAR和VARCHAR,不同的是它们包含二进制字符串而不包含非二进制字符串。
4、ENUM类型:
ENUM中文名称叫枚举类型,它的值范围需要在创建表时通过枚举方式显示指定,对1~255个成员的枚举需要1个字节存储,对于255~65535个成员,需要2个字节来存储。最多允许65535个成员。
create table t (gender enum('M','F'));
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中重复值只取一次
超出范围的内值不允许插入操作
1、JSON类型比字符类型有如下优点:
JSON数据类型会自动校验数据是否为JSON格式,如果不是JSON格式数据,则会报错;
MySQL提供了一组操作JSON数据的内置函数,可以方便地提取各类数据,可以修改特定的键值;
优化的存储格式,存储在JSON列中的JSON数据被转换成内部的存储格式,允许快速读取;
简单地说,JSON实际就是Javascript的一个子集,支持的数据类型包括
NUMBER、STRING、BOLLEAN、NULL、ARRAY、OBJECT共6种,一个JSON中的元素可以是这6种类型元素的任意组合;
BOOLEAN:true/false
NULL:null
字符串和日期类型:用双引号引起来
ARRAY:括号引起来
OBJECT:KV,要用大括号引起来
注意:JSON,数据类型对于大小写是敏感的,常见的null、true、false必须是小写才合适。
2、必须要使用navicat 12.1.x 版本才能正常创建json 类型的字段
navicat 12.1.x 以下版本 类型手动写json,也可以创建表成功,但是查询结构显示不了,需要使用mysql自带客户端查询: select * from 表名称 where json_contains(字段名称,'包含的值');
,
如: select * from test where json_contains(dd,'1');
1、+:运算符用于获得一个或多个值的和;
2、-:运算符用于从一个值中减去另一个值;
3、*:运算符使数字相乘,得到两个或多个值的乘积;
4、/:运算符用一个值除以另一个值得到商;DIV
5、%:运算符用一个值除以另外一个值得到余数;MOD
注意:在除法运算和模运算中,如果除数为0,将是非法除数,返回结果为NULL。
1、“=”运算符:用于比较运算符两侧的操作数是否相等,如果两侧操作数相等,则返回值为1,否则为0。注意NULL不能用于“=”比较。
2、“<>”运算符:和“=”相反,如果两侧操作数不等,则值为1,否则为0。NULL不能用于“<>”比较。
3、“<=>”运算符:和”=“类似,在操作数相等时值为1,不同之处在于即使操作的值为NULL也可以正确比较。
4、”<”运算符:当左侧操作数小于右侧操作数时,其返回值为1,否则其值为0。
5、“<=”运算符:当左侧操作数小于等于右侧操作数时,其返回值为1,否则返回值为0。
6、“>”运算符:当左侧操作数大于右侧操作数时,其返回值为1,否则返回值为0。
7、”>=”运算符:当左侧操作大于等于右侧操作数时,其返回值为1,否则返回值为0。
8、”BETWEEN“运算符的使用格式为“a BETWEEN min AND max”,当a大于等于min并且小于等于max,则返回值为1,否则返回0。
9、”IN“运算符使用的格式为”a IN(value1,value2...)“,当a的值存在于列表中时,则整个比较表达式返回的值为1,否则返回0。
10、”IS NULL“运算符的使用格式为”a IS NULL“,当a的值为NULL,则返回值为1,否则返回值为0。
11、”IS NOT NULL“运算符的使用格式为”a IS NOT NULL“,当a的值为不为NULL,则返回值为1,否则返回值为0。
12、”LIKE“运算符的使用格式为”a LIKE %123%“,当a中含有字符串”123“时,则返回值为1,否则返回值0。
13、”REGEXP“运算符的使用格式为”str REGEXP str_pat“,当字符串中含有str_pat相匹配的字符串,则返回值为1,否则返回0
LIKE 和 REGEXP之间的重要差别 LIKE 匹配整个列,如果被匹配的文本在列值中出现,LIKE 将不会找到它,相应的行也不会被返回(除非使用通配符)。而 REGEXP 在列值内进行匹配,如果被匹配的文本在列值中出现,REGEXP 将会找到它,相应的行将被返回,并且 REGEXP 能匹配整个列值(与 LIKE 相同的作用)。
1、“NOT” 或 “!” 表示逻辑非。
2、“AND” 或 “&&” 表示逻辑与运算。
3、“OR” 或 “||” 表示逻辑或运算。
4、“XOR” 表示逻辑异或。
1、“&” 位与:对多个操作数的二进制位做逻辑与操作。
2、“|” 位或:对多个操作数的二进制位做逻辑或操作。
3、“^” 位异或:对操作数的二进制位做异或操作 。
4、“~” 位取反:对操作数的二进制位做NOT操作。
5、“>>” 位右移:对左操作数向右移动右操作数指定的位数。
6、“<<” 位左移:对左操作数向左移动右操作烽指定的位数。
优先级顺序 | 描述及存储需求 |
---|---|
1 | := |
2 | ||、OR、XOR |
3 | &&、AND |
4 | NOT |
5 | BETWEEN、CASE、WHEN、THEN、ELSE |
6 | =、<=>、>=、>、<=、<、<>、!=、IS、LIKE、REGEXP、IN |
7 | | |
8 | & |
9 | <<、>> |
10 | -、+ |
11 | *、/、DIV、%、MOD |
12 | ^ |
13 | -(一元减号)、~(一元比特反转) |
14 | ! |
:= 和 = 运算符在大部分场景下并无区别,但 := 更为全场景些。
= 只有在 set 和update时才是和 := 一样,赋值的作用,其它都是关系运算符 等于 的作用。
:= 不只在 set 和 update 时赋值的作用,在 select 也是赋值的作用。