Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >大战SQL列类型及其列属性

大战SQL列类型及其列属性

作者头像
小Bob来啦
发布于 2020-12-08 07:07:27
发布于 2020-12-08 07:07:27
1.5K00
代码可运行
举报
运行总次数:0
代码可运行

趣味小谈

最近,在看一本《原则》的书籍,是写的一位美国人投资史。其中谈到和他的创业伙伴关系出现裂缝时,我们会怎样做?

原文如下:和我关系密切的人理解我,不讨厌我,有时甚至喜欢我,而那些与我联系不太密切的人被我的直率冒犯。很明显,我需要加深对别人的理解,别人也需要加深对我的理解。之后我意识到,在人际关系中,人们应当把各自的相处原则说得极为清楚,这至关重要。

我想,很多时候大家都会碰到这样或那样不被小伙伴理解的事情,那么事实上会不会是我们自己没和小伙伴说明清楚呢?包括小编自己也是,有时候奇怪的想法可能会和平时所想不一样,从而所表达出来的意思可能也就会和平常有误差,这时候我们也要学着和小伙伴说明清楚,毕竟不同的人会有着不同的理解,在成长的路上,继续加油

SQL学习历程

MySQL也有好几天没看了,部分语句都已不太熟悉,得赶快拿起来温习温习。

上次讲到了列类型的枚举类型,那么接下来还有集合记录长度,列属性倒不是特别多,也就有空属性,列描述以及默认值,所以学起来也是超快~

集合字符串

集合跟枚举实际上很类似,实际上存储的是数值,而不是字符串(集合可以多选)

集合定义:set 元素列表

使用:使用元素列表中的多个元素,使用逗号分隔

插入数据:使用多个元素字符串组合,也可以直接插入数值

相关语句:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 创建集合表
create table my_set(
hobby set ('篮球','足球','乒乓球','排球')
-- 集合中每一个元素都是对应一个二进制位,被选中为1,没有则为0,最后一步反过来
)charset utf8;

-- 插入数据
insert into my_set values ('足球,乒乓球');
insert into my_set values (3);-- 代表乒乓球:篮球+足球

-- 查看集合数据
select hobby + 0, hobby from my_set;

值得注意,在查看数据时,我们会看到一些数字,如下:

简述其数值原理:

原理:集合中每一个元素都是对应一个对应的二进制位,比如3,二进制位为0011,在集合中,每一个元素都是对应一个二进制位,被选中为1,没有则为0;最后反过来。即:集合中每一个元素都是对应的一个二进制位。

集合中元素的顺序是没有关系的:最终系统都会去匹配顺序,简单来说,便是存储与顺序无关,系统会自动匹配0和1,这样也节省了空间。

比如你第一次记录了篮球和足球,那么第二次你记录足球和篮球其数值是一样的,这也就是其存储与顺序无关。

集合的强大在于能够规范数据和节省空间:谈到数据规范,PHP也可以规范数据,对于PHP来说其效率优先,而数据的维护可以通过数字进行,从而会导致PHP的维护成本增加:PHP根本没有办法判断数据在数据库的形式。所以集合实际上很少用,枚举可能还会用,虽然效率低一些,但能判断元素的确切位置。

记录长度

在MySQL中规定:任何一条记录最长不能超过65535个字节(varchar最大为65536个字符,达不到理论值)。

那么varchar实际存储长度能达到多少呢?

实际存储长度主要看字符集编码:utf8和GBK下的varchar的实际顶配。

当我们输入相关语句查看时:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 求varchar在utf8和GBK下的实际最大值
create table my_utf8(
name varchar(21844)
)charset utf8;
-- 填入65535时报错提示最大为21845,填入也为错:21845*3+2>65535.正确的为21844*3+2
create table my_gbk(
name varchar(32766)
)charset gbk;
-- 同理,报错提示最大为32767,填入也为错32767*2+2>65535,正确的为32766

在执行上面语句时大家可能还会想到其实会多出一个字节,那么想要用完是否可以添加tinyint字段呢?

实际上是不行的,因为MySQL记录中:如果任何一个字段允许为空,那么系统会自动从整个记录中保留一个字节来存储NULL,若想释放NULL所占用的字节:必须保证所有的字段都不允许为空。

如添加tinyint字段后报错:

那么怎样才可以呢?

输入以下语句时:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create table my_utf82(
age tinyint not null ,
name varchar(21844)not null
)charset utf8;
create table my_gbk2(
age tinyint not null,    -- 一个字节 
name varchar(32766)not null 
)charset gbk;

执行结果如下:

在MySQL中text文本字符串,是不占用记录长度:即额外存储,但text文本字符串也属于记录的一部分;一定会占据记录中的部分长度:10个字节(用于其保护数据的地址以及长度)。

相关语句:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- text 占用10个字节
create table my_text(
name varchar(21841) not null,
content text not null  -- not null 用于判断text是否占用为10个字节
)charset utf8;

执行结果:

下面可以开始讲述列属性的三个小部分啦~

列属性

是真正约束字段的数据类型。

列属性有很多:NULL/NOT NULL,default,primary key,auto_increment,comment(描述表的字段)

这里讲到的是空属性,列描述和默认值。

空属性

两个值:NULL(默认的)和NOT NULL(不为空)

数据值是默认的,且数据库基本都是字段为空;但是实际上在开发的时候,是需要尽可能的保证所有的数据都不应该为空:因为空数据无意义,也没有办法参与运算(如下图):

再创建一个实际案列表:班级表(名字,教室)

相关语句:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 创建班级表(数据!)
create table my_class(
name varchar(20) not null,
room varchar(20) null  -- 允许为空;不写默认允许为空
)charset utf8;

然后查看该表中数据(no代表不能为空):

列描述(注释)

列描述:comment,起描述作用,无实际意义。是专门用来描述字段,根据表的创建语句一起保存的。

当数据很相似时,数据管理员不怎么方便查看,这就给数据库管理员带来了麻烦,那么列描述的作用就显现出来了。

创建表以及相关语句:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 创建表
create table my_teacher(
name varchar(20) not null comment '姓名',
money decimal (10,2) not null comment '工资'
)charset utf8;

执行如下:

默认值

某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值或者自己选择不使用默认值。

默认值关键字:default

默认值的生效:在数据插入的时候,不给该字段赋值即可。

创建表以及插入数据相关语句:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 默认值
create table my_default(
name varchar(20) not null,
age tinyint unsigned default 0,
gender enum('男','女','保密') default '男'
)charset utf8;

insert into my_default (name) values ('小明');
insert into my_default  values ('小明1号',18,default);

执行结果如下:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员Bob 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【MySQL】数据库的数据类型
mysql 中表的建立属性列:列名称 数据类型,例如 num int,它与我们平时写的语言数据类型是倒过来的!
YoungMLet
2024/03/01
3260
【MySQL】数据库的数据类型
MySQL-简介
alter table user change column name username varchar(20);
用户9615083
2022/12/25
6380
MySQL-简介
初识MySQL · 数据类型
对于MySQL来说,是一门编程语言,可能定义不是那么的严格,但是对于MySQL来说也是拥有自己的数据类型的,比如tinyint,varchar等,不过通过本章的学习,你就会知道,这里的数据类型其实和C语言中的数据类型挺像的。
_lazy
2025/03/28
1030
初识MySQL · 数据类型
【MySQL】数据库基础&&库/表的操作&&数据类型详解
为解决上述问题,专家们设计出更加利于管理数据的东西-数据库,能更加有效的管理数据,数据库的水平是衡量一个程序员水平的重要指标
用户10925563
2025/02/16
1480
【MySQL】数据库基础&&库/表的操作&&数据类型详解
【MYSQL】数据类型
当我们插入一个超过范围的数据时,我们会发现会插入失败,由此我们可以得到一个结论:我们成功插入到MYSQL中的数据,一定是合法的。这样能够约束程序员尽可能的插入正确的数据。
青衫哥
2023/10/17
3300
【MYSQL】数据类型
mysql基础
创建mysql数据表的时候,通常会指定类型和长度,那么到底代表什么意思呢,每种类型最大长度又是多少,经过我的查阅资料和实验,把结果记录一下
leobhao
2022/06/28
3620
【MySql】MySql的数据类型
对于数据类型分类,这里简单分为数值类型(如BIT,BOOL,INT),文本、二进制类型(如CHAR,VARCHAR),时间日期(DATE),String类型(如ENUM类型),这里简单了解一下即可
平凡的人1
2023/10/15
6660
【MySql】MySql的数据类型
Linux——MySQL基础
也就是说,mysql是一套提供数据存储服务的网络程序。 数据库一般指的是在磁盘或者内存中存储的特定结构组织的数据——将来在磁盘中存储数据的一套特定方案。 数据库服务就是mysqld。 为什么有数据库 虽然一般文件确实提供了数据存储的功能,但是站在用户角度上,文件并没有提供非常好的数据管理能力。 数据库的本质:对数据内容存取的一套解决方案,你给我数据内容,我直接给你结果。
有礼貌的灰绅士
2025/05/10
1120
Linux——MySQL基础
MySQL数据类型
尽量不使用unsigned,对于int类型可能存放不下的数据,int unsigned同样可能存放不下,与其如此,还不如设计时,将int类型提升为bigint类型。
每天都要进步呀
2023/10/16
2950
MySQL数据类型
MySQL2_字符集及数据类型
文章目录 MySQL_字符集及数据类型 1.字符集 2.校对集 3.MySQL的数据类型--值的类型 (1)整型 (2)unsigned(无符号) (3)显示宽度(zerofill) (4)浮点型 (
以某
2023/03/07
4580
MySQL(三)
指在数据显示的时候,最长可以显示的位数。 如果需要始终以最大长度显示,可以使用 zerofill 属性。 注意: 使用了 zerofill,一定是无符号整型。因为从左到右 0 填充。
1ess
2021/11/01
7620
【MySQL】004.MySQL数据类型
当我们插入128,-129的时候就会发现报错插入的数据超出数据范围。因为tinyint的数据范围是-128 - 127
_孙同学
2025/04/20
820
【MySQL】004.MySQL数据类型
MySQL-学习笔记
Win mysql安装:Windows下安装MySQL详细教程 - m1racle - 博客园 (cnblogs.com)
小简
2022/12/27
4280
MySQL-学习笔记
Mysql 复习总结
 /********** 基本数据类型*******************/
明明如月学长
2021/08/27
7810
mysql多字段主键_sql改变列数据类型
整数类型:tinyint、smallint、mediumint、integer、bigint
全栈程序员站长
2022/09/28
2.7K0
mysql多字段主键_sql改变列数据类型
【Mysql】:linux环境下表的三部曲(数据操作 + 类型解析 + 约束规则)
这篇文章只是对以前的内容作个详细补充,想要速成操作的,可以参考这篇博客 【MySQL学习】:关系数据库标准语言SQL
IsLand1314
2025/02/09
1770
【Mysql】:linux环境下表的三部曲(数据操作 + 类型解析 + 约束规则)
【MySQL基础篇】四、数据类型
​ 上图列举了 mysql 中的数据类型,其实我们主要分为四种类型来讲解,数据类型比较接近的比如说 tinyint、smallint、int 等几个类型,我们只会挑其中一个来讲,因为其它都是类似的!
利刃大大
2025/05/21
1120
【MySQL基础篇】四、数据类型
MySQL数据类型
总结: 如果插入的数据超过MySQL数据类型的范围,那么MySQL就不让你插入,直接拦截,不让做对应的操作。这点和C/C++一样,但是编译器不会报错,语言上给你发生截断,编译器内部可能会隐式转换。 如果已经有数据被成功插入到MySQL中,那么插入的时候一定是合法的。 因此,MySQL中,一般而言,数据类型本身也是一种约束。这种约束倒逼程序员,让程序员尽可能正确插入,如果不正确插入,MySQL也能保证插入的数据合法性。这样就能保证数据库中的数据是可预期完整的。
南桥
2024/07/26
2040
MySQL数据类型
【MySQL】MySQL常见数据类型
从这个数值类型我们也可以发现,这其实也是一种约束。如果我们向mysql特定的类型中插入不合法的数据,MySQL一般会直接拦截相应的操作。这种类型的约束,也可以保证数据库中的数据是可预期的、完整的。
P_M_P
2024/08/12
2000
【MySQL】MySQL常见数据类型
MySQL数据库数据类型
在MySQL数据库中,MySQL数据类型分有四大类:数值类型、文本/二进制类型、时间日期和String类型。以下是这四大类的具体类型:
二肥是只大懒蓝猫
2023/10/13
4330
MySQL数据库数据类型
相关推荐
【MySQL】数据库的数据类型
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验