上节说到,在创建表的同时,需要给出列的定义。列的定义可展开如下:

列名 列的数据类型 列的一些其他属性(可选)

由于列名可自定义,故这里不做详细探讨。建议不要使用关键字或保留字即可,非要使用的话就得加上反引号了(``),唯有如此,才能让程序有效地将它们区分开。接下来,主要来学习一下列的数据类型及列的一些其他属性吧。

本文概览:

(一)列的数据类型

(二)列的一些其他属性

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(四)的更多相关文章

  1. 从零开始学MySQL(二)

    鉴于上节篇幅以安装为主,因此对于调用mysql所需要使用的“命令”只是略微提及.随之而来就会带给读者诸多不解了,因为你会思考,这串长长的字符到底有什么特殊的含义呢?聪明的你可能早就抱着好奇心去“摆渡” ...

  2. 从零开始学安全(四十四)●TCP三次握手四次挥手

    wireshark:Beyond Compare是一个网络封包分析软件.网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料.Wireshark使用WinPCAP作为接口,直接与 ...

  3. 从零开始学安全(四)●Vmware CentOS 7 添加静态ip联网

    一.虚拟网络编辑器配置 1.VMnet8设置(不需要改动) 2.NAT设置(不需要改动) 3.DHCP设置(CentOS IP地址段设置,不需要改动) 二.虚拟机设置(网络适配器选择NAT模式) 三. ...

  4. Java从零开始学十四(包和访问控制)

    一.java中的包 Java文件的组织形式Windows中的文件功能类似 在开发比较大的项目时,不可能只涉及到一个java文件,可能要创建几十,甚至几百个java文件,这个时候,我们就可以使用包,把相 ...

  5. 从零开始学JavaScript四(数据类型)

    一.分类 基本数据类型:undefined.null.string.Boolean.number 复杂数据类型:object object的属性以无序的名称和值对的形式 (name : value) ...

  6. 从零开始学MySQL(三)

    经过上两节的洗礼,我们能够连接上服务器,并成功地进入与mysql交互的会话中了.那么现在就可以发起SQL语句,让服务器来执行它了!这听起来很酷吧?接下来,我们开始学习MySQL的相关知识. 本文概览: ...

  7. 从零开始学MySQL(一)

    如果您浏览过许多IT类的招聘职位,那么掌握数据库技能的重要性便不言自明了.因JAVA常常与MySQL所挂钩,因此兴起了写博客记载学习的念头,盼与君共勉.然,在进行MySQL语法的学习之前,我们无不面临 ...

  8. 从零开始学安全(四十六)●sqli-labs 1-4关 涉及的知识点

    Less-1 到Less-4  基础知识注入 我们可以在 http://127.0.0.1/sqllib/Less-1/?id=1 后面直接添加一个 ‘ ,来看一下效果: 从上述错误当中,我们可以看到 ...

  9. 从零开始学安全(四十五)●browser_autopwn2漏洞利用配合Ettercap工具实施DNS欺骗攻击

    系统:kali 2019  工具Ettercap,Metasploit 环境内网地址 首先 cd /etc/ettercap/ 移动在ettercap 文件下 在用vim 打开编辑 etter.dns ...

随机推荐

  1. web编辑器的快捷键

    alt 键:可以同时选中多个光标 .box 按住 tab 键 可以快速的 <div class="box"></div> #box 按住 tab 键 可以快 ...

  2. 【洛谷T89353 【BIO】RGB三角形】

    题目链接 这个题我一开始显然直接暴力 然后30分(但是应用数据分治的我通过复杂度判断并且其余输出0的能力硬生生的拿下了60分) 主要还是讲正解 这里有一个结论 这样一个图,红点的值可以通过两个黄点来判 ...

  3. ACL 2019 分析

    ACL 2019 分析 word embedding 22篇! Towards Unsupervised Text Classification Leveraging Experts and Word ...

  4. C# WinForm开发系列学习 地址 很详细

    http://www.cnblogs.com/peterzb/archive/2009/07/27/1531910.html

  5. httpd启动显示Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName'

    AH00557: httpd: apr_sockaddr_info_get() failed for masterAH00558: httpd: Could not reliably determin ...

  6. Visual Studio Code 断点调试Nodejs程序跳过node内部模块(internal modules)

    Built-in core modules of Node.js can be referred to by the ‘magic name’ <node_internals> in a ...

  7. Vue中的model

    v-model语法糖: model: 默认情况下,一个组件上的 v-model 会把 value 用作 prop 且把 input 用作 event, 但是一些输入类型比如单选框和复选框按钮可能想使用 ...

  8. 测开之路一百四十二:ORM框架之SQLAlchemy建库、建表、数据库操作

    flask-SQLAlchemy是在原生SQLAlchemy的基础之上做了一层封装,安装flask-SQLAlchemy会自动安装SQLAlchemy 安装 传统的sql建表建字段 通过flask-S ...

  9. PyQt5学习一---环境的安装和配置

    PyQt5环境安装 1.Python环境(我在练习的时候是用的Python3.6.8) 2.PyQt5安装 首先安装sip pip install sip 然后安装PyQt5-tools pip in ...

  10. java保留2位或n位小数

    1.直接使用字符串处理 double ds = Double.valueOf(String.format("%.3f", Math.random()).toString()); 这 ...