MySQL数据类型

一、Int类型

类型字节最小值(带符号)最大值(带符号)最小值(无符号)最大值(无符号)
TINYINT1-1281270255
SMALLINT2-3276832767065535
MEDIUMINT3-83886088388607016777215
INT4-2147483648214748364704294967295
BIGINT8-92233720368547758089223372036854775807018446744073709551615

1.1 有无符号
演示:

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;--运行行出错

SELECT a-b FROM test_unsigned;–运行行出错如下图
在这里插入图片描述
1.2 int(N)是什么?
演示:

CREATE TABLE test_int_n(a INT(4) ZEROFILL);
INSERT INTO test_int_n VALUES(1);
INSERT INTO test_int_n VALUES(123456);

在这里插入图片描述

  • int(N)中的N是显示宽度,不表示存储的数字的长度的上限
  • zerofill表示当存储的数字长度 < N时,用数字0填充左边,直至补满长度N
  • 当存储数字的长度超过N时,按照实际存储的数字显示

1.3 自动增长的面试题
1.3.1 create table test_auto_increment(a int auto_increment);语法有错误吗?
答:有错误,只能有一个自动列,它必须被定义为键。应该定义为 create table test_auto_increment(a int auto_increment primary key);

1.3.2 当把a列设置为自增之后执行 INSERT INTO test_auto_increment VALUES(NULL);语句会有何结果?
在这里插入图片描述

1.3.3 执行insert into test_auto_increment values(0);语句会有何结果?
在这里插入图片描述
1.3.4 执行insert into test_auto_increment values(-1);语句会有何结果?
在这里插入图片描述
1.3.5 执行insert into test_auto_increment values(null),(100),(null),(10),(null)语句会有何结果?
在这里插入图片描述

二、字符类型

类型说明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

2.1 排序规则

SELECT 'a'='A';
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'; 

在这里插入图片描述

三、时间类型

日期类型占用空间表示范围
DATETIME81000-01-01 00:00:00 ~ 9999-12-31 23:59:59
DATE31000-01-01 ~ 9999-12-31
TIMESTAMP41970-01-01 00:00:00UTC ~ 2038-01-19 03:14:07UTC
YEAR1YEAR(2):1970-2070, YEAR(4):1901-2155
TIME3-838:59:59 ~ 838:59:59

3.1 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';

在这里插入图片描述
在这里插入图片描述

四、JSON类型

4.1 新建一个表

create table json_user (
 uid int auto_increment,
 data json,
 primary key(uid)
 );

在这里插入图片描述
4.2 插入数据

insert into json_user values (
null, '{
   "name":"lison",
"age":18,
"address":"enjoy"
   }' );

 insert into json_user values (
 null,
 '{
  "name":"james",
  "age":28,
  "mail":"james@163.com"
 }');

假如插入的不是JSON格式的会怎么样
在这里插入图片描述4.3 json_extract 抽取

SELECT json_extract('[10, 20, [30, 40]]', '$[1]');

在这里插入图片描述

  SELECT json_extract(DATA, '$.name'),json_extract(DATA, '$.address') FROM json_user;

在这里插入图片描述
4.4 JSON_OBJECT 将对象转为json

SELECT json_object("name", "enjoy", "email", "enjoy.com", "age",35);

在这里插入图片描述```sql
INSERT INTO json_user VALUES (NULL, json_object(“name”, “enjoy”, “email”, “enjoy.com”, “age”,35) );

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190704100317756.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FpbWFzaGk2MjA=,size_16,color_FFFFFF,t_70)
**6.5 json_insert 插入数据**
```sql
   UPDATE json_user SET DATA = json_insert(DATA, "$.address_2", "xiangxue") WHERE uid = 1;

在这里插入图片描述
4.5 json_merge合并数据并返回
在这里插入图片描述
在这里插入图片描述其他函数参考:https://dev.mysql.com/doc/refman/5.7/en/json-function-reference.html
在这里插入图片描述
4.6 JSON索引
JSON 类型数据本身 无法直接 创建索引,需要将需要索引的 JSON数据 重新 生成虚拟列(Virtual Columns) 之后,对 该列 进行 索引,如下

 CREATE TABLE test_inex_1(
  DATA json,
  gen_col VARCHAR(10) generated always AS (json_extract(DATA, '$.name')), 
INDEX idx (gen_col) 
 );

在这里插入图片描述
注意gen_col列中的king、peter是带双引号的
在这里插入图片描述SELECT json_extract(DATA,"$.name") AS username FROM test_inex_1 WHERE gen_col=“king”;执行此sql查不出内容
在这里插入图片描述
给查询条件"king"再加上双引号就能查询到数据
在这里插入图片描述

EXPLAIN SELECT json_extract(DATA,"$.name") AS username FROM test_inex_1 WHERE gen_col="king"

在这里插入图片描述如上给查询条件"king"再加上双引号才能查询到数据显然是不太合理的,那么怎么样创建索引才能避免这种问题呢,答案是使用json_unqote(),如下

CREATE TABLE test_index_2 (
 DATA json,
 gen_col VARCHAR(10) generated always AS (
 json_unquote( 
 json_extract(DATA, "$.name")
 )),
 KEY idx(gen_col)
 );

在这里插入图片描述

以上内容来自“享学课堂”笔记课后巩固练习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值