从零开始学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 ...
随机推荐
- 大哥带的mssql注入拿shell
任务二 注入点拿shell 路径的爆破 https://blog.csdn.net/edu_aqniu/article/details/78409451 0X01判断 是否为判断当前数据库用户名是否为 ...
- SpringMVC前端控制器以.html后缀拦截,访问接口返回406问题
原因: spring监测到是.html来访问,它就会认为需要返回的是html页面.如果返回的不是html,会报406错误 解决: 提供多种后缀拦截方式,工程里web.xml配置 分析: HTTP 40 ...
- 微信小程序 API 界面 (2)
由于每个 API 参数:对象的属性都有 success,fail,complete,所以在这个提前介绍,就不再每个API 上写了 success:类型 函数 接口调用成功的回调函数 fail:类型 函 ...
- 如何将post请求转换成put和delete请求
<form:form action="${pageContext.request.contextPath}/emp" method="POST" mode ...
- 阶段3 1.Mybatis_05.使用Mybatis完成CRUD_2 Mybatis的CRUD-保存操作
增加的方法 修改映射配置 id是方法名 按照原来jdbc的写法 values里面应该是一堆问号,现在这里不能再去写问号了因为要取值 从我们要执行的方法传的参数里面去取值 所以参数的类型我们必须要告诉这 ...
- Java连接Hive使用Zookeeper的方式
Java连接Hive的方式就是通过JDBC的方式来连接,URL为jdbc:hive2://host:port/db;principal=X@BIGDATA.COM等,这种方式是直接连接HiveServ ...
- com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'jeewx.weixin_account_user_relation' doesn't exist
[INFO] Scanning for projects...[INFO] [INFO] ------------------------------------------------------- ...
- NW.js
1.package.json属性说明: ——window窗口外观常用属性包括: title : 字符串,设置默认 title width/height : 主窗口的大小 toolbar : bool ...
- 在树莓派上搭建jupyter notebook server
自从搬家后,树莓派闲置了好一段时间,最近打算将其利用起来.想来想去,搭个jupyter notebook用要靠谱的,毕竟经常要实验一些Python脚本. 具体过程参考以下链接: https://www ...
- Failure to find com.oracle:ojdbc6:jar:11.2.0.1.0
报错原因:oracle的ojdbc.jar是收费的,maven的中央仓库是没有的,需要下载到本地,然后打包进maven仓库 1.下载ojdbc6-11.2.0.1.0.jar包 http://cent ...