MySql数据类型

本文详细介绍了MySQL的几种数据类型。Int类型方面,探讨了有无符号的使用、INT(N)的含义及自动增长的面试题;字符类型提及排序规则ci和bin的区别;时间类型对比了datetime与timestamp,包括时区概念、字节占用、存值默认值等方面。

 

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

当存储数字的长度 超过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

 

datatimetimestamp区别

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

转载于:https://www.cnblogs.com/Soy-technology/p/11037563.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值