从零开始学MySQL(四)
上节说到,在创建表的同时,需要给出列的定义。列的定义可展开如下:
列名 列的数据类型 列的一些其他属性(可选)
由于列名可自定义,故这里不做详细探讨。建议不要使用关键字或保留字即可,非要使用的话就得加上反引号了(``),唯有如此,才能让程序有效地将它们区分开。接下来,主要来学习一下列的数据类型及列的一些其他属性吧。
本文概览:
(一)列的数据类型
(二)列的一些其他属性
ps:
原本打算自己写的,适才发现实在没有必要错过网上一些良好的资源。以下列举数据类型的截图来自菜鸟教程,若您想查看原文,还请点击下面的链接进行查阅:https://www.runoob.com/mysql/mysql-data-types.html 。即便如此,笔者还是建议您予以重视,因为列的数据类型还是蛮重要的(笔者亲身经历过的一次笔试,其第一道题即要求列出某个数据库的数据类型),何况其中不是一味照搬,还会有一些讲解来辅助您的理解。
(一)列的数据类型
在创建表的时候,决定每一列将存储什么样类型的数据是必须的,因为这直接关系到对存储空间的占用(无论是硬盘还是内存)。
ps: 对于存储在硬盘上应该是没有什么异议的,因为我们明显能感受出物理存储空间大小的变化;而内存则更像一条“通道”,负责将数据从第一地方带到另外一个地方。比如在进行插入操作时,会先将数据读入内存,然后再通过内存写入到硬盘上达到永久的存储;又如查询操作,会先从硬盘上提取出相关的数据到内存,然后才显示到客户端。
在MySQL中,数据被分为三类:数字类型、字符串类型、日期和时间类型。需要注意的是,“日期和时间类型”是特殊的数字类型,因为它和数字一样,可以进行计算。
1. 数值类型
数值类型包括整数(无小数位)、定点数(DECIMAL)、浮点数(可以有小数位)。
在这里,我们还需要了解的是,“精确值数”和“近似值数”的区别。
(1) 组成
精确值数:整数(如,3、9)、带小数点的数(由三部分组成:一个数字序列、一个小数点、另一个数字序列。如,3.9、3.、.9)。
近似值数:采用科学计数法表示的浮点数(由三部分组成:带小数点的数、一个底数、一个指数。底数是字母e或E,指数可正可负。如,3.9e-5、-3.9e5)。
(2) 运算
精确值数在使用时与指定值是完全一致的,因此其进行的是精确运算。也就是说,只要没有超出那些数值的精度范围,就不会丢失精度。如,3.98765就不允许插入到值允许两位小数的列里。
近似值数进行的是近似运算,也就是说,会有舍入误差。
另外,还需要和“无符号”取下经。
无符号的标志是 UNSIGNED。如何使用呢?答曰:在对应的数值类型后面添加即可,记得要使用空格隔开,否则解析器理解不了。如 SMALLINT UNSIGNED、INT UNSIGNED等等。
2. 字符串类型
字符串类型包括定长、变长两种类型,比如CHAR和VARCHAR的区别就在于此。
3. 日期和时间类型
日期和时间类型包括日期与时间、时间戳、年类型。
这里需要作额外讲解的是:
① CHAR和VARCHAR两者的区别和选用。
区别:
CHAR:属于“定长”的字符串类型。什么是定长,通俗点讲就是固定长度。比如CHAR(10)就是只能存储大小为10个字节的数据,可少不可多。少则系统会自动补充空白字符。 VARCHAR:属于“变长”的字符串类型。变长,即可变化的长度。比如VARCHAR(10)就是你存储的大小有多少就是多少,不会多也不会少。少的话,也无须系统帮忙填充。
选用:
(1)选用CHAR(X)较佳的情景:
当所有值的长度都是 X 个字符,那么VARCHAR(X)会比CHAR(X)多占用存储空间。因为VARCHAR需要额外使用2个字节来记录字符的长度(小于255使用1个字节,大于255使用2个字节)。
当使用的是MyISAM表,并且各个值的长度差别不大,那么选用CHAR更好。因为MyISAM存储引擎对固定长度行的处理效率更高。
(2)选用VARCHAR(X)较佳的场景:
当数据长短不一,选用VARCHAR类型就可以节省空格占用的存储空间了。
纠正:
“上面提过CHAR(10)就是只能存储大小为10个字节的数据”,实际上是不完全正确的。
MySQL4.0以前, varchar(20) 是20个字节。此时可存放的字符数应当是字节长与编码形式共同决定的——比如GBK每个字符最多占用两个字节,UTF8每个字符最多占用三个字节,因此varchar(20)分对应存储20/2、20/3得到的结果。(前者偏高,因为该结果并没有考虑用来记录字符长度的字节呢!而后者则比较充足。)
MySQL5.0以后的,varchar(20)是20个字符。
此外,MySQL定义行的长度不得超过65535(64k),而该值正也限制了每行拥有的多少个列。
② 日期与时间类型中日期的表示法和写法。
表示法:
在MySQL中,时间类型的固定模式为“CCYY-MM-DD”。比如,要表示“今天”这个日期,你只能确切写为“2019-05-17”,而不能使用“05-17-2019”之类的来表示。
写法:
在插入一条记录的时候(现在不懂也没关系。后面会学习,学到后面再回来翻看一下即可),为日期列赋值时,记得要带上单引号( ' ' ),否则MySQL会报错。
比如,您可以尝试一下下面的语句,观察最后面的语句的报错信息:
CREATE TABLE interview
(interview_date DATE,
period CHAR(2),
address VARCHAR(50),
company VARCHAR(50)); INSERT INTO interview(interview_date) VALUES('2019-05-17'); INSERT INTO interview(interview_date) VALUES(2019-05-17);
(二)列的一些其他属性
在创建表的时候,列的一些其他属性为可附加的。这类设置通常是对要存储的数据进行进一步的限制,比如允许为空(NULL)、禁止为空(NOT NULL)、为空时将设为默认值(DEFAULT 某个默认值)等等。具体详细请看下面。
(1)空值 NULL / NOT NULL
空值这一属性,决定了该列在插入数据时,能否为空。
(2)默认值 DEFAULT
默认值这一属性深化了“先入为主”这一概念,即在插入数据时,若给该列赋值,则采用赋予的值;否则以设置的默认值填充之。
ps:若赋予NULL值,则直接设置为默认值。即非NULL值 > 默认值 = NULL值。
(3)注释值 COMMENT '请使用其他内容代替此处文本'
注释值当然是基于开发维护用的,用于对列的描述。因此使用“DESCRIBE语句”是无法查看到它的,必须使用“SHOW CREATE TABLE 对应表名”才行。
(4)主键 PRIMARY KEY
什么是主键?主键指的是一个表里面最为主要的键。(“最”字就说明了一个表有且只有一个。既可以让一个列作为主键,也可以让两个以上列同时作为主键。“两个以上列的主键”,我们更习惯称之为“组合主键”,因为它们的结合才能起到标识记录的作用。什么是标识?请看下面)。
现在问您,表里面存储的是什么?记录?对的。前面提到过每条记录都会包含该表的所有列,既然主键作为表最主要的东东,自然是不可替代的,轻松依靠它标识每一个记录不在话下。换句话说,它就像记录的“身份证号码”。将身份证号码的性质推及到主键上,我们可以确定主键中的值一定是唯一的、不能为空的,即PRIMARY KEY = UNIQUE KEY + NOT NULL( 注意与第(5)小点区分开 )。
ps:不要将主键等同于列。否则很容易陷入“一个主键=一个列”这一傻瓜想法。主键是列的一个附加属性,仅此而已。
(5)唯一键 UNIQUE KEY
什么是唯一键?唯一键就是值唯一。
什么鬼?我不明白主键已经可以约束列值为唯一的,为什么还需要这货?因为一个表中只能有一个主键呀!如果有多处值要求唯一,那么单单依靠主键并不能解决问题。此时UNIQUE KEY就派得上用场了。这间接说明了,一个表可以有多个唯一键。
ps:NULL是可以填入UNIQUE KEY的列的,NULL值还可以有多个(why? 因为NULL不等于NULL呀!现在您明白了吗?)。
(6)自动增长序列 AUTO_INCREMENT
AUTO_INCREMENT属性的作用是:自动生成序列编号。
那么如何保证生成的序列编号“唯一”呢?让AUTO_INCREMENT与PRIMARY KEY / UNIQUE KEY相结合不就行了吗?因此,附加AUTO_INCREMENT属性的列还应设置为唯一键或主键。此外,还有一个硬性要求——一个表中只能有一个列具有ANTO_INCREMENT属性。
从零开始学MySQL(四)的更多相关文章
- 从零开始学MySQL(二)
鉴于上节篇幅以安装为主,因此对于调用mysql所需要使用的“命令”只是略微提及.随之而来就会带给读者诸多不解了,因为你会思考,这串长长的字符到底有什么特殊的含义呢?聪明的你可能早就抱着好奇心去“摆渡” ...
- 从零开始学安全(四十四)●TCP三次握手四次挥手
wireshark:Beyond Compare是一个网络封包分析软件.网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料.Wireshark使用WinPCAP作为接口,直接与 ...
- 从零开始学安全(四)●Vmware CentOS 7 添加静态ip联网
一.虚拟网络编辑器配置 1.VMnet8设置(不需要改动) 2.NAT设置(不需要改动) 3.DHCP设置(CentOS IP地址段设置,不需要改动) 二.虚拟机设置(网络适配器选择NAT模式) 三. ...
- Java从零开始学十四(包和访问控制)
一.java中的包 Java文件的组织形式Windows中的文件功能类似 在开发比较大的项目时,不可能只涉及到一个java文件,可能要创建几十,甚至几百个java文件,这个时候,我们就可以使用包,把相 ...
- 从零开始学JavaScript四(数据类型)
一.分类 基本数据类型:undefined.null.string.Boolean.number 复杂数据类型:object object的属性以无序的名称和值对的形式 (name : value) ...
- 从零开始学MySQL(三)
经过上两节的洗礼,我们能够连接上服务器,并成功地进入与mysql交互的会话中了.那么现在就可以发起SQL语句,让服务器来执行它了!这听起来很酷吧?接下来,我们开始学习MySQL的相关知识. 本文概览: ...
- 从零开始学MySQL(一)
如果您浏览过许多IT类的招聘职位,那么掌握数据库技能的重要性便不言自明了.因JAVA常常与MySQL所挂钩,因此兴起了写博客记载学习的念头,盼与君共勉.然,在进行MySQL语法的学习之前,我们无不面临 ...
- 从零开始学安全(四十六)●sqli-labs 1-4关 涉及的知识点
Less-1 到Less-4 基础知识注入 我们可以在 http://127.0.0.1/sqllib/Less-1/?id=1 后面直接添加一个 ‘ ,来看一下效果: 从上述错误当中,我们可以看到 ...
- 从零开始学安全(四十五)●browser_autopwn2漏洞利用配合Ettercap工具实施DNS欺骗攻击
系统:kali 2019 工具Ettercap,Metasploit 环境内网地址 首先 cd /etc/ettercap/ 移动在ettercap 文件下 在用vim 打开编辑 etter.dns ...
随机推荐
- esLint——规范你的代码(转)
团队协作时,若是团队的代码风格统一,能够大大减少沟通成本. 什么是 ESLint ? ESLint 是在 ECMAScript/JavaScript 代码中识别和报告模式匹配的工具,它的目标是保证代码 ...
- sqli-labs(10)
基于双引号的时间盲注 先来随便测试一下 发现 错不错都是返回的真确的结果 那么应该是被从定向了 我们可以输入 and sleep(5) %23 测试 加’发现立刻返回 加双引号发现报错了 过了5秒才返 ...
- 《Effective Java》读书笔记 - 8.通用编程
Chapter 8 General Programming Item 45: Minimize the scope of local variables local variables应该在他们要被用 ...
- Sqlserver 创建账号
下面是通过脚本创建账号,创建一个appuser 的账号,密码:123456,可操作的DB:TEST 赋予权限,增删改查,操作视图,存储过程.当然当前的账号要有足够的权限. create login a ...
- Python深度学习读书笔记-3.神经网络的数据表示
标量(0D 张量) 仅包含一个数字的张量叫作标量(scalar,也叫标量张量.零维张量.0D 张量).在Numpy 中,一个float32 或float64 的数字就是一个标量张量(或标量数组).你可 ...
- vim字体设置
经过多方试验,在win下设置vim的大小终于成功了,备份如下, 现在把gvim7.1更改字体的方法记录如下,一段时间后,可能会失效,对他人造成困扰吧?!^_^ 在_vimrc中写:set guif ...
- EMQ插件通过HTTP连接认证服务器实现认证
需求 在EMQ中添加认证插件,将到来的MQTT连接的ClientID.UserName.Password通过HTTP协议发送到认证服务器,用返回的数据决定是否允许该连接: 在连接时和断开时向服务器发送 ...
- Python基本语法_文件操作_读写函数详解
目录 目录 软件环境 file文件对象 open文件操作 读文件 read读取所有文件内容 readline获取一行内容 readlines读取所有文件内容 readreadlinereadlines ...
- 阶段3 1.Mybatis_05.使用Mybatis完成CRUD_6 Mybatis的CRUD-保存操作的细节-获取保存数据的id
保存后得到id 默认查询出来的是0,因为没有插入就要得到最后的id值. insert语句跟在前面就可以获取到id了 新插入的这条数据就是51 order=after表示在insert语句后再去获取id ...
- Python学习之==>面向对象编程(一)
一.面向对象与面向过程 面向对象与面向过程是两种不同的编程范式,范式指的是按照什么方式去编程.去实现一个功能.不同的编程范式本质上代表对各种不同类型的任务采取不同的解决问题的思路. 1.面向过程编程 ...