Mysql 数据类型
数据类型-int
int 的有符号和无符号的区别
有符号的int可以存储负值,无符号的int不可以存储负值;
int类型若不声明是否有符合则默认有符号,正负都可以存储;
整型的每一种都分无符号(unsigned)和有符号(signed)两种类型(float和double总是带符号的),在默认情况下声明的整型变量都是有符号的类型(char有点特别),如果需声明无符号类型的话就需要在类型前加上unsigned。
无符号版本和有符号版本的区别就是无符号类型能保存2倍于有符号类型的正整数数据,比如16位系统中一个smallint能存储的数据的范围为-3276832767,而unsigned能存储的数据范围则是065535。
由于在计算机中,整数是以补码形式存放的。根据最高位的不同,如果是1,有符号数的话就是负数;如果是无符号数,则都解释为正数。另外,unsigned若省略后一个关键字,大多数编译器都会认为是unsigned int。
简而言之就是由于Int型占4字节,也就是16位,2^16 = 65535,如果有符号位就+ -两边均分,如果没有就全给+。
int 有符号测试
-- 创建一个有符号的int类型的abc的表;默认有符号
create table bcd (a int,b int);
-- 新增数据
insert into bcd values(1,2);
-- 查询数据
select * from bcd;
-- 查询2-1:结果为1
select b-a from bcd;
-- 查询1-2:结果为-1
select a-b from bcd;
测试结果:成功
int 无符号测试
-- 创建一个无符号的int类型的abc的表
create table abc (a int unsigned,b int unsigned);
-- 新增数据
insert into abc values(1,2);
-- 查询数据
select * from abc;
-- 查询2-1:结果为1
select b-a from abc;
-- 查询1-2:结果异常
select a-b from abc;
测试结果:超出精度异常
int(n):其中的n是什么意思?
n 的意思是显示长度:若结果长度小于 n 则会自动前面加 0 进行补齐,若结果长度不小于 n 则正常显示
-- 创建一个int(4)的数据库表(Ps:若不加 zerofill 则没什么鸟用)
create table test_int_n (a int(4) zerofill);
-- 新增两条数据(一个值为1;一个值为123456)
insert into test_int_n values(1),(123456);
mysql bin 命令行>查询结果
数据库连接工具>查询无效果
int自增
- 自增只能创建在主键上面
- null 和 0 都可以自自增
- 可以在自增列插入负值
- delete数据不会重置自增计数值,truncate数据才会充值自增计数值
自增只能创建在主键上面
-- 非主键字段创建自动增长:异常
create table test_auto_increment(a int auto_increment);
-- 主键字段创建自动增长:成功
create table test_auto_increment(a int auto_increment primary key);
null 自增验证
-- 在自增表里面插入数据
insert into test_auto_increment values(null),(10),(null),(100),(null);
-- 查询自增表中的数据
select * from test_auto_increment;
0 自增验证
新增前查询结果
新增数据
-- 在自增表中新增0
insert into test_auto_increment values(0);
可以在自增列插入负值
-- 在自增表中插入负值:是可以执行成功的
insert into test_auto_increment values(-1);
数据类型-字符类型
字符(n)中的 n 是字符还是字节?
char(n) 和varchar(n) 中的 n 是字符还是字节?
答:字符。
text(n) 中的 n 是字符还是字节?
答:字节。
除了 char 和 varchar 中的 n 是字符,其他的都是字节。
数据库中有true和false吗?
数据库中只有0和1,没有true和false;
-- 1:相当于 true
select 'a' = 'a';
-- 0:相当于false
select 'a' = 'b';
运行结果
数据库中排序规则里面的 bin 和 ci 是什么意思?
bin:二进制的方式存储的,大小写敏感(不会忽略大小写)。
ci:大小写不敏感(会忽略大小写)。
sql测试:1:相当于 true;0:相当于false。
#设置为utf8mb4_bin
set names utf8mb4 collate utf8mb4_bin;
sql测试:1:相当于 true;0:相当于false。
mysql 获取varchar类型数字最大值
SELECT MAX(CAST(no AS SIGNED)) FROM sys_user ;
数据类型-时间类型
date、timestamp和datetime的区别是什么?
- date表示日期,其范围为1000-01-01到9999-12-31
- datetime表示日期时间,其范围是1000-01-01 00:00:00到9999-12-31 23:59:59
- timestamp表示时间戳,1970-01-01 00:00:00到2038-01-19 03:14:07,timestamp具有自动初始化和自动更新功能。
timestamp:有时区的概念;datetime:没有时区的概念
timestamp和datetime的区别测试
-- 创建一个时间类型的表
create table test_time (a timestamp,b datetime);
-- 新增数据
insert into test_time values(NOW(),NOW());
-- 查询时间的环境变量
select @@time_zone;
当时间的环境变量为 SYSTEM 时,看不出区别
-- 修改时间的环境变量
set time_zone='+00:00';
当时间的环境变量为 +00:00时,则可以看出两个时间不同
一般所有时间都是北京东八区的时间。