mysql basic_MySQL数据类型(basic)

基本类型

整数类型

字节

最小值

最大值

TINYINT

1

有符号 -128

无符号 0

有符号 127

无符号 255

SMALLINT

2

有符号 -32768

无符号 0

有符号 32767

无符号 65535

MEDIUMINT

3

有符号 -8388608

无符号 0

有符号 8388607

无符号 1677215

INT INTEGER

4

有符号 -2147483648

无符号 0

有符号 2147483647

无符号 4294967295

浮点数类型

字节

最小值

最大值

FLOAT

4

\(\pm1.175494351E-38\)

\(\pm3.102823466E+38\)

DOUBLE

8

\(\pm2.2250738585074014E-308\)

\(\pm1.7976931348623157E+308\)

定点数类型

字节

描述

描述

DEC(M,D),

DECIMAL(M,D)

M+2

最大取值范围与DOUBLE相同,

给定DECIMAL的有效取值范围

由M和D决定

位类型

字节

最小值

最大值

BIT(M)

1~8

BIT(1)

BIT(64)

日期类型

日期和时间类型

字节

最小值

最大值

DATE

4

1000-01-01

9999-12-32

DATETIME

8

1000-01-01 00:00:00

9999-12-31 23:59:59

TIMESTAMP

4

19700101080001

2038年的某个时刻

TIME

3

-838:59:59

838:59:59

YEAR

1

1901

2155

TIMESTAMP

show variables like 'explicit%'; 来查看变量

TIMESTAMP默认CURRENT_TIMESTAMP和not null和on update CURRENT_TIMESTAMP

MySQL中只给表中的第一个TIMESTAMP字段设置默认值为系统日期, 如果有第二个TIMESTAMP类型, 则默认值设置为0

MySQL5.6之前,可以修改第二个timestamp类型字段为其他日期常量,但是不能再修改为current_timestamp.同一张表中只有一列的默认值为current_timestamp. 在MySQL5.6版本之后, 这个限制已经去掉了

如果把1中的explict_defaults_for_timestamp设置为on, 则默认值 . not null 和 on update current_timestamp不会自动设置

TIMESTAMP重要特点, 就是和时区相关.

当插入日期的时候, 会先转化为本地时区后存放

当从数据库取出后, 也同样需要将日期转换为本地时区后显示

TIMESTAMP与DATETIME区别

timestamp支持的时间范围小, 而datetime范围大.两者都可以设置默认值和on update current_timestamp属性. 使得日期列可以随其他列更新而自动更新为最新时间.

timestamp在MySQL5.6.6版本之后增加了控制参数 explicit_defaults_for_timestamp, 如果设置为on 则timestamp需要显示指定默认值和on update current_timestamp属性. 如果设置为off, 则会自动设置默认值.

当explicit_defaults_for_timestamp设置为off时, 表中额第一个TIMESTAMP列自动设置为系统时间. 如果在一个TIMESTAMP列中插入NULL, 则该列值会自动设置为当前的日期和时间. 在插入或更新一行但不明确给TIMESTAMP列赋值时也会自动设置该列的值为当前的日期和时间

TIMESTAMP的插入和查询都受当地时区的影响, 更能反映出实际的日期, DATETIME则只能反映出插入时当地的时区, 其他时区的人查看数据必然有很大的误差.

TIMESTAMP的属性受MySQL版本和服务器SQLMode的影响很大.

字符串类型

字符串类型

字节/字符

描述及存储需求

CHAR(M)

M个字符

M为0~255整数

VARCHAR(M)

0~M个字符

M为0~65535之间整数, 值的长度+1一个字节

BITARY(M)

M个字符

M为0~255之间的整数

VARBINARY(M)

0~M个字符

M为0~65535之间整数,值的长度+1字节

TINYBLOB

允许长度0~255字节,值长度+1字节

BLOB

0~65535 value+2

MEDIUMBLOB

0~167772150 value+3

LONGBLOB

0~4294967295 value+4

TINYTEXT

0~255 value+1

TEXT

0~65535 value+2

MEDIUMTEXT

0~167772150 value+3

LONGTEXT

0~4294967295 value+4

CHAR和VARCHAR类型

CHAR与VARCHAR很类似, 都是用来保存MySQL较短的字符串. 两者的区别主要是存储方式的不同

CHAR列的长度固定为创建表时声明的长度, 长度可以为从0~255的任何值

VARCHAR列中的值为可变长度, 长度可以指定0~65535之间的值

在检索的时候CHAR去除了尾部的空格, 而VARCHAR则保留了这些空格

BINARY和VARBINARY类型

类似于CHAR和VARCHAR

不同的是它们是包含二进制字符串而不包含非二进制字符串

create table t(

c BINARY(3)

);

insert into t set c='a';

select *,hex(c),c='a',c='a\0',c='a\0\0' from t;

1eb9850bdc658b65695b3f41ccb99352.png

从上面可以看出 BINARY(3)列当插入"a"变为"a\0\0"

ENUM类型

枚举类型, 值范围需要在创建表时通过枚举方式显式指定 对1~255个成员的枚举需要1个字节存储 对255~65535个成员需要2个字节存储.

最多允许拥有65535个成员

create table t (gender enum('M','F'));

insert into t values('M'),('1'),('f'),(NULL);

select * from t;

391e6e0e5b8dbfea2b117974fb423154.png

上述例子中可以看出ENUM类型是忽略大小写的, 1代表了枚举中的第一个元素M

SET类型

SET和ENUM类型非常类似, 也是由一个字符串对象, 里面可以包含0~64个成员, 成员不同存储上也不同

1~8 -> 一字节

9~16 -> 2

17~24 -> 3

25~32 -> 4

33~64 ->8

create table t(col set('a','b','c','d'))

insert into t values('a,b'),('a,d,a'),('a,c'),('a');

select * from t;

53143c2ca50252baa447215ac9d45b62.png

JSON类型

JSON是JavaScript Object Notation缩写(很有用), 它是一种数据交换格式.

JSON出现前数据交换大多使用XML类传递数据

但是XML规范太JB多了

在2002年雅虎工程师Douglas Crockford于2002年发明了JSON, 风靡WEB

自5.7.8版本起, MySQL开始支持JSON类型. 此前通常使用VARCHAR或TEXT来保存JSON格式数据.

JSON有如下优点

JSON数据类型会自动校验数据是否为JSON格式. 如果不是JSON格式会报error

MySQL提供了一组操作JSON数据的内置函数, 可以方便地提取各类数据, 可以修改特定的键值.

优化的存储格式, 存储在JSON列中的JSON数据被转换成内部的存储格式, 允许快速读取

create table t1(id1 json);

insert into t1 values('{"age":20,"time":"2018-07-14 10:52:00"}');

select JSON_TYPE('"abc"') js1,JSON_TYPE('[1,2,"abc"]') js2,JSON_TYPE('{"k1":"value"}') js3;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值