1.1.1. Int类型
类型 |
|
字节 |
最小值 |
最大值 |
|
|
|
(带符号的/无符号的) |
(带符号的/无符号的) |
TINYINT |
|
1 |
-128 |
127 |
|
|
|
0 |
255 |
SMALLINT |
|
2 |
-32768 |
32767 |
|
|
|
0 |
65535 |
MEDIUMINT |
|
3 |
-8388608 |
8388607 |
|
|
|
0 |
16777215 |
INT |
|
4 |
-2147483648 |
2147483647 |
|
|
|
0 |
4294967295 |
BIGINT |
|
8 |
-9223372036854775808 |
9223372036854775807 |
|
|
|
0 |
18446744073709551615 |
1.1.1.1. 有无符号
在项目中主键使用BIGINT,而且是有符号的(因为无符号的运算时出现负数会报错)。
演示
create table test_unsigned(a int unsigned, b int unsigned);
insert into test_unsigned values(1, 2);
select b - a from test_unsigned; --运行正常
select a - b from test_unsigned; --运行出错
1.1.1.2. INT(N)是什么?
演示(需要在Linux上才能看出区别)
create table test_int_n(a int(4) zerofill);
insert into test_int_n values(1);
insert into test_int_n values(123456);
---结果,都能插入成功
l int(N)中的 N 是显示宽度, 不表示 存储的数字的 长度 的上限。
l zerofill 表示当存储的数字 长度 < N 时,用 数字0 填充左边,直至补满长度 N
l 当存储数字的长度 超过N时 ,按照 实际存储 的数字显示
1.1.1.3. 自动增长的面试题
这列语法有错误吗?
create table test_auto_increment(a int auto_increment);
---插入报错(非主键,不能自增)
create table test_auto_increment(a int auto_increment primary key);
---插入成功,主键能自增
以下结果是什么?
insert into test_auto_increment values(NULL);
--插入成功,值:1
insert into test_auto_increment values(0);
--插入报错(不能插入0)
insert into test_auto_increment values(-1);
--插入成功,值:-1
insert into test_auto_increment values(null),(100),(null),(10),(null)
-- 1,100,101,10,11 (从上一条数据の数据值+1 递增)
1.1.2. 字符类型(除了char跟vachar是字符,其余都是字节)
类型 |
说明 |
N的含义 |
是否有字符集 |
最大长度 |
CHAR(N) |
定长字符 |
字符 |
是 |
255 |
VARCHAR(N) |
变长字符 |
字符 |
是 |
16384 |
BINARY(N) |
定长二进制字节 |
字节 |
否 |
255 |
VARBINARY(N) |
变长二进制字节 |
字节 |
否 |
16384 |
TINYBLOB(N) |
二进制大对象 |
字节 |
否 |
256 |
BLOB(N) |
二进制大对象 |
字节 |
否 |
16K |
MEDIUMBLOB(N) |
二进制大对象 |
字节 |
否 |
16M |
LONGBLOB(N) |
二进制大对象 |
字节 |
否 |
4G |
TINYTEXT(N) |
大对象 |
字节 |
是 |
256 |
TEXT(N) |
大对象 |
字节 |
是 |
16K |
MEDIUMTEXT(N) |
大对象 |
字节 |
是 |
16M |
LONGTEXT(N) |
大对象 |
字节 |
是 |
4G |
1.1.2.1. 排序规则(ci跟bin)
当创建一个utf-8_ci排序规则的数据库,插入数据a、A执行下面操作:
select 'a' = 'A';
--结果:1 (数据库中用1和0表示true跟false)
create table test_ci (a varchar(10), key(a));
insert into test_ci values('a');
insert into test_ci values('A');
select * from test_ci where a = 'a'; --结果是什么?
--结果:a、A都显示出来了
重新设置当前字符排序规则后,再执行where a = 'a' ....
set names utf8mb4 collate utf8mb4_bin
--结果:只有a显示
总结:MySQL中ci排序规则不区分大小写,bin排序规则区分大小写(转换成二进制比较)
1.1.3. 时间类型
日期类型 |
占用空间 |
表示范围 |
DATETIME |
8 |
1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 |
DATE |
3 |
1000-01-01 ~ 9999-12-31 |
TIMESTAMP |
4 |
1970-01-01 00:00:00UTC ~ 2038-01-19 03:14:07UTC |
YEAR |
1 |
YEAR(2):1970-2070, YEAR(4):1901-2155 |
TIME |
3 |
-838:59:59 ~ 838:59:59 |
datatime与timestamp区别 create table test_time(a timestamp, b datetime); insert into test_time values (now(), now()); select * from test_time; select @@time_zone; set time_zone='+00:00'; select * from test_time; |
datatime与timestamp区别:
1.timestamp有时区的概念。(存储时会转成MySQL默认时区存储,取值时会反转成服务器当前设置的时区时间显示)
datetime没有时区的概念。(存值是啥,取值就是啥)
2.timestamp占4个字节,也决定了它的最大存值时间是2038年(2038年之后的时间不能存放)
datetime占8个字节,最大存值到9999年
3.timestamp存值,默认是数据库当前时间,更新时也是取当前时间
datetime存值,默认是null