数据类型
MySQL支持多种数据类型,主要有数值类型、日期/时间类型、字符串类型。
- 数值类型:
- 整数类型:TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT
- 浮点小数类型:FLOAT、DOUBLE
- 定点小数类型:DECIMAL
- 日期/时间类型:YEAR、TIME、DATE、DATETIME、TIMESTAMP
- 字符串类型:CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM、SET等。
(1)整数类型
类型名称 | 说明 | 存储需求 | 取值范围(无符号数) |
---|---|---|---|
TINYINT | 很小的整数 | 1个字节 | 0~255 |
SMALLINT | 小的整数 | 2个字节 | 0~65535 |
MEDIUMINT | 中等大小的整数 | 3个字节 | 0~16777215 |
INT(INTEGER) | 普通大小的整数 | 4个字节 | 0~4294967295 |
BIGINT | 大整数 | 8个字节 | 0~18446744073709551615 |
注意:
CREATE TABLE tb_emp1
id INT(11)
);
id字段的数据类型为INT(11),注意到后面的数字11,这表示的是该数据类型指定的显示宽度,指定能够显示的数值中数字的个数。
显示宽度和数据类型的取值范围是无关的。
显示宽度只是指明MySQL最大可能显示的数字个数,数值的位数小于指定的显示宽度时会由空格填充;如果插入了大于显示宽度的值,只要该值不超过该类型整数的取值范围,数值依然可以插入,而且能够显示出来。
显示宽度只用于显示,并不能限制取值范围和占用空间。
(2)浮点数类型和定点数类型
浮点类型和定点类型都可以用(M,N)来表示其中M称为精度,表示总共的位数;N称为标度,是表示小数的位数。
类型名称 | 说明|存储需求|取值范围(无符号数)
1. | :-: | -:
FLOAT|单精度浮点数|4个字节|0和1.175494351E-38~3.402823466E+38
DOUBLE|双精度浮点数|8个字节|0和2.22507385072014E-308~1.7976931348623157E+308
DECIMAL(M,D),DEC|压缩的“严格”定点数|M+2个字节|
(3)日期和时间类型
类型名称 | 日期格式 | 日期范围 | 存储需求 |
---|---|---|---|
YEAR | YYYY | 1901~2155 | 1个字节 |
TIME | HH:MM:SS | -838:59:59~838:59:59 | 3个字节 |
DATE | YYYY-MM-DD | 1000-01-01~9999-12-3 | 3个字节 |
DATETIME | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00~9999-12-31 23:59:59 | 8个字节 |
TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:01 UTC~2038-01-19 03:14:07 UTC | 4个字节 |
(1)YEAR
YEAR值的指定格式:
- 以4位字符串或4位数字,范围为“1901”~“2155”;
- 以2位字符串格式表示YEAR,范围为“00”~“99”。“00”~“69”和“70”~“99”范围的值分别被转换为2000~2069和1970~1999范围的YEAR值;
- 以2为数字表示的YEAR,范围为00~99。0值被转换为0000,而非2000。
(2)TIME
TIME值的指定格式:
- ‘D HH:MM:SS’格式的字符串。还可以使用“非严格”的语法:‘HH:MM:SS’、‘HH:MM’、‘D HH:MM’、‘D HH’或‘SS’。D表示日,可以取0~34之间的值。在插入数据库时,D被转换为小时保存,格式为“D * 24 + HH”;
- ‘HHMMSS’格式、没有间隔符的字符串或HHMMSS格式的数值,假定是有意义的时间。不合法的格式会变为00:00:00。
为TIME列分配简写值时应注意:如果没有冒号,MySQL解释值时,假定最右边的两位表示秒。例如,1120和‘1120’,MySQL解释为00:11:20。
TIME值中如果使用冒号则肯定被看作当天时间。例如,‘11:20’表示11:20:00。
(3)DATE类型
DATE值的指定格式:
- 以‘YYYY-MM-DD’或者‘YYYYMMDD’字符串格式表示的日期,取值范围为‘1000-01-01~9999-12-3’;
- 以‘YY-MM-DD’或者‘YYMMDD’字符串格式表示的日期,在这里YY表示两位的年值。‘00~69’范围的年值会转换为‘2000~2069’;‘70~99’范围的年值会转换为‘1970~1999’;
- 以YY-MM-DD或者YYMMDD数字格式表示的日期,与前面年值转换方法一样。
- 使用CURRENT_DATE或者NEW(),插入当前系统日期。
(4)DATETIME
DATETIME值的指定格式:
- 以‘YYYY-MM-DD HH-MM-SS’或者‘YYYYMMDDHHMMSS’字符串格式表示的值,取值范围为‘1000-01-01 00:00:00~9999-12-31 23:59:59’;
- 以‘YY-MM-DD HH-MM-SS’或者‘YYMMDDHHMMSS’字符串格式表示的日期,在这里YY表示两位的年值,与之前类似;
- 以YYYYMMDDHHMMSS或者YYMMDDHHMMSS数字格式表示的日期和时间;
(5)TIMESTAMP
显示格式与DATETIME相同。但取值范围小于DATETIME的取值范围,为‘1970-01-01 00:00:01’ UTC~‘2038-01-19 03:14:07’ UTC,其中,UTC(Coordinated Universal Time,为世界标准时间),因此在插入数据时,要保证在合法的取值范围内。
(4)字符串类型
类型名称 | 说明 | 存储需求 |
---|---|---|
CHAR(M) | 固定长度非二进制字符串 | M字节,1<=M<=255 |
VARCHAR(M) | 变长非二进制字符串 | L+1字节,在此L<=M和1<=M<=255 |
TINYTEXT | 非常小的非二进制字符串 | L+1字节,在此L<2^8 |
TEXT | 小的非二进制字符串 | L+2字节,在此L<2^16 |
MEDIUMTEXT | 中等大小的非二进制字符串 | L+3字节,在此L<2^24 |
LONGTEXT | 大的非二进制字符串 | L+4字节,在此L<2^32 |
ENUM | 枚举类型,只能有一个枚举字符串值 | 1或2个字节,取决于枚举值的数目(最大值65535) |
SET | 一个设置,字符串对象可以有零个或多个SET成员 | 1,2,3,4或8个字节,取决于集合成员的数量(最多64个成员) |
1. CHAR和VARCHAR类型
CHAR(M):当检索CHAR值时,尾部的空格将被删除掉;
VARCHAR(M):VARCHAR在值保存和检索时尾部的空格仍保留。
2. TEXT类型
不同的TEXT类型的存储空间和数据长度不同:
(1)TINYTEXT最大长度为255(2^8-1)字符的TEXT列;
(2)TEXT最大长度为65535(2^16-1)字符的TEXT列;
(3)MEDIUMTEXT最大长度为16777215(2^24-1)字符的TEXT列;
(4)LONGTEXT最大长度为4294967295或4GB(2^32-1)字符的TEXT列。
3. ENUM类型
ENUM是一个字符串对象,其值为表创建时在列规定中枚举的一列值。语法格式为:
字段名 ENUM('值1', '值2', ……, '值n')
//ENUM值在内部用整数表示,每个枚举值均有一个索引值;
//列表值所允许的成员值从1开始编号,MySQL存储的就是这个索引编号。
//枚举最多可以有65535个元素。
4.SET类型
SET是一个字符串对象,可以有零或多个值,SET列最多可以有64个成员,其值为表创建时规定的一列值。语法格式如下:
SET('值1', '值2', ……, '值n')
//与ENUM类型相同,SET值在内部用整数表示,列表中每一个值都有一个索引编号。
//当创建表时,SET成员值的尾部空格将自动被删除。
//与ENUM类型不同的是,ENUM类型的字段只能从定义的列值中选择一个值插入,
//而SET类型的列可从定义的列值中选择多个字符的联合。
//如果在插入SET字段中列值有重复,则自动删除重复的值;
//如果插入顺序不重要,按照定义的顺序显示;
//如果插入了不正确的值,默认情况下,MySQL忽略,并给出警告。
(5)二进制类型
类型名称 | 说明 | 存储需求 |
---|---|---|
BIT(M) | 位字段类型 | 大约(M+7)/8个字节 |
BINARY(M) | 固定长度二进制字符串 | M个字节 |
VARBINARY(M) | 可变长度二进制字符串 | M+1个字节 |
TINYBLOB(M) | 非常小的BLOB | L+1字节,在此L<2^8 |
BLOB(M) | 小的BLOB | L+2字节,在此L<2^16 |
MEDIUMBLOB(M) | 中等大小的BLOB | L+3字节,在此L<2^24 |
LONGBLOB(M) | 非常大的BLOB | L+4字节,在此L<2^32 |
运算符优先级(由低到高)
- 最低:=(赋值运算),:=
- 中间(从低到高):
||,OR
XOR(异或)
&&,AND
NOT
BETWEEN,CASE,WHEN,THEN,ELSE
=(比较运算),<=>,>=,>,<=,<,<>,!=,IS,LIKE,REGEXP,IN
|
&
<<,>>
-,+
*,/(DIV),%(MOD)
^
-(负号),~(位反转) - 最高:!