MySQL学习第六天 学习MySQL基本数据类型_Mysql

还记得上一篇学习的内容吗?不记得再看一看MySQL学习第五天 MySQL数据库基本操作,温故可以知新!

        数据类型是指列、存储过程参数、表达式和局部变量的数据特征,它决定了数据的存储方式,代表了不同的信息类型。MySQL中常用的的数据类型包括:数值类型、日期和时间类型和字符串类型等。

 一、数值类型

       MySQL支持所有标准SQL中的数值类型,其中包括严格数据类型(INTEGER、SMALLINT、DECIMAL、NUMBERIC),以及近似数值数据类型(FLOAT、REAL、DOUBLE、PRESISION),并在此基础上进行扩展。扩展后增加了TINYINT、MEDIUMINT、BIGINT这3种长度不同的整形,并增加了BIT类型,用来存放位数据。

(1).整型

       在MySQL中支持的5个主要整数类型是TINYINT、SMALLINT、MEDIUMINT、INT和BIGINT。这些类型在很大程度上是相同的,只有它们存储的值的大小是不相同的。

       MySQL以一个可选的显示宽度指示器的形式对SQL标准进行扩展,这样当从数据库检索一个值时,可以把这个值加长到指定的长度。例如,指定一个字段的类型为INT(6),就可以保证所包含数字少于 6 个的值从数据库中检索出来时能够自动地用空格填充。需要注意的是,使用一个宽度指示器不会影响字段的大小和它可以存储的值的范围。万一我们需要对一个字段存储一个超出许可范围的数字,MySQL会根据允许范围最接近它的一端截短后再进行存储。还有一个比较特别的地方是,MySQL会在不合规定的值插入表前自动修改为0。

       下面的表显示了需要的每个整数类型的存储和范围:

       上面定义的都是有符号的,当然了,也可以加上UNSIGNED关键字,定义成无符号的类型,那么对应的取值范围就要翻翻了,比如:TINYINT UNSIGNED的取值范围为0~255。

       例如我们存储人的年龄,就是使用TINYINT UNSIGNED:

CREATE TABBLE tb1(
 age TINYINT UNSIGNED,
); 

(2).浮点型

       MySQL支持的三个浮点类型是FLOAT、DOUBLEDECIMAL类型。FLOAT数值类型用于表示单精度浮点数值,而DOUBLE数值类型用于表示双精度浮点数值。与整数一样,这些类型也带有附加参数:一个显示宽度指示器和一个小数点指示器。比如语句 FLOAT(7,3) 规定显示的值不会超过7位数字,小数点后面带有3位数字。对于小数点后面的位数超过允许范围的值,MySQL会自动将它四舍五入为最接近它的值,再插入它。

       DECIMAL数据类型用于精度要求非常高的计算中,这种类型允许指定数值的精度和计数方法作为选择参数。精度在这里指为这个值保存的有效数字的总个数,而计数方法表示小数点后数字的位数。比如语句DECIMAL(7,3) 规定了存储的值不会超过7位数字,并且小数点后不超过3位。

      下表给出了它们的存储范围:

       我在MySQL中建立了一个表,有一列为FLOAT(5, 3);做了以下试验:

       1)插入123.45678,最后查询得到的结果为99.999;

       2)插入123.456,最后查询结果为99.999;

       3)插入12.34567,最后查询结果为12.346;

       所以,在使用浮点型的时候,还是要注意陷阱的,要以插入数据库中的实际结果为准。

       例如我们存储工作人员的工资就是使用FLOAT(8,2) UNSIGNED:

CREATE TABBLE tb1(
 salary FLOAT(8,2) UNSIGNED
); 

二、日期时间类型

       在处理日期和时间类型的值时,MySQL带有5个不同的数据类型可供选择。它们可以被分成简单的日期、时间类型,和混合日期、时间类型。根据要求的精度,子类型在每个分类型中都可以使用,并且MySQL带有内置功能可以把多样化的输入格式变为一个标准格式。

       下表解释了五种日期和时间类型:

1)、MySQL用DATE和YEAR类型存储简单的日期值,使用TIME类型存储时间值。这些类型可以描述为字符串或不带分隔符的整数序列。如果描述为字符串,DATE类型的值应该使用连字号作为分隔符分开,而TIME类型的值应该使用冒号作为分隔符分开。需要注意的是,没有冒号分隔符的TIME类型值,将会被MySQL理解为持续的时间,而不是时间戳。

 2)、除了日期和时间数据类型,MySQL还支持DATEYIME和TIMESTAMP这两种混合类型。它们可以把日期和时间作为单个的值进行存储。这两种类型通常用于自动存储包含当前日期和时间的时间戳,并可在需要执行大量数据库事务和需要建立一个调试和审查用途的审计跟踪的应用程序中发挥良好作用。如果我们对TIMESTAMP类型的字段没有明确赋值,或是被赋与了NULL值。MySQL会自动使用系统当前的日期和时间来填充它。

       例如我们存储添加用户的出生年月就是使用:

CREATE TABBLE tb1(
 brithday DATE
); 

 三、字符串类型

       MySQL提供了6个基本的字符串类型,分别为CHAR、VARCHAR、TINYTEST、TEXT、MEDIUMTEXT、LONGTEXT六种字符串类型。可以存储的范围从简单的一个字符到巨大的文本块或二进制字符串数据。

      下标解释了六种基本字符串类型:

1)、CHAR(n)和VARCHAR(n)中括号中n代表字符的个数,并不代表字节个数,所以当使用了中文的时候(UTF8)意味着可插入m个中文,但是实际会占用m*3个字节。

2)、同时CHAR和VARCHAR最大的区别就在于CHAR不管实际VALUE都会占用n个字符的空间,而VARCHAR只会占用实际字符应该占用的空间+1,并且实际空间+1<=n。

3)、超过CHAR和VARCHAR的n设置后,字符串会被截断。

4)、CHAR在存储的时候会截断尾部的空格,VARCHAR和TEXT不会。

5)、VARCHAR会使用1-3个字节来存储长度,TEXT不会。

6)、CHAR类型用于定长字符串,并且必须在圆括号内用一个大小修饰符来定义。这个大小修饰符的范围从 0-255。比指定长度大的值将被截短,而比指定长度小的值将会用空格作填补。

       例如我们存储登录用户的用户名就是使用VARCHAR(20):

CREATE TABLE tb1(
 username VARCHAR(20)
); 

实例:

       我们现在来验证上述四个字段是否能创建成功:

CREATE TABLE tb1 (
 username VARCHAR(20),
 age TINYINT UNSIGNED,
 salary FLOAT(8,2) UNSIGNED,
 brithday DATE
); 

       创建数据表tb1和查看数据表结构的结果为:

       我们向数据表tb1中插入记录:INSERT tb1 VALUES('Tom',22,5555.55,'1994-10-01'); 

       执行的结果显示为:

四、复合类型

  MySQL还支持两种复合数据类型ENUM和SET,它们扩展了SQL规范。虽然这些类型在技术上是字符串类型,但是可以被视为不同的数据类型。一个ENUM类型只允许从一个集合中取得一个值;而SET类型允许从一个集合中取得任意多个值。

(1)ENUM类型       

ENUM(“member1″, "member2″, … “member65535″)

ENUM数据类型就是定义了一种枚举,最多包含65535个不同的成员。当定义了一个ENUM的列时,该列的值限制为列定义中声明的值。如果列声明包含NULL属性,则NULL将被认为是一个有效值,并且是默认值。如果声明了NOT NULL,则列表的第一个成员是默认值。

ENUM类型因为只允许在集合中取得一个值,有点类似于单选项。在处理相互排拆的数据时容易让人理解,比如人类的性别。ENUM类型字段可以从集合中取得一个值或使用NULL值,除此之外的输入将会使MySQ在这个字段中插入一个空字符串。另外如果插入值的大小写与集合中值的大小写不匹配,MySQL会自动使用插入值的大小写转换成与集合中大小写一致的值。

ENUM类型在系统内部可以存储为数字,并且从1开始用数字做索引。一个ENUM类型最多可以包含65536个元素,其中一个元素被MySQL保留,用来存储错误现的值是合法输入,除此之外其它任何输入都将失败。这说明通过搜索包含空字符串或对应数字索引为0的行就可以很容易地找到错误记录的位置。

 (2)SET类型

SET(“member", "member2″, … “member64″)

SET数据类型为指定一组预定义值中的零个或多个值提供了一种方法,这组值最多包括64个成员。值的选择限制为列定义中声明的值。

SET类型与ENUM类型相似但不相同。SET类型可以从预定义的集合中取得任意数量的值。并且与ENUM类型相同的是任何试图在SET类型字段中插入非预定义的值都会使 MySQL插入一个空字符串。如果插入一个即有合法的元素又有非法的元素的记录,MySQL将会保留合法的元素,除去非法的元素。

一个 SET 类型最多可以包含64项元素。在SET元素中值被存储为一个分离的“位”序列,这些“位”表示与它相对应的元素。“位”是创建有序元素集合的一种简单而有效的方式。并且它还去除了重复的元素,所以SET类型中不可能包含两个相同的元素。希望从SET类型字段中找出非法的记录只需查找包含空字符串或二进制值为0的行。

复合数据类型的例子我们会在以后的博文中使用到,这里不再进行举例。

五、总结

       通过对每种数据类型的用途,物理存储,表示范围等有一个概要的了解。这样在面对具体应用时,就可以根据相应的特来来选择合适的数据类型,使得我们能够争取在满足应用的基础上,用较小的存储代价换来较高的数据库性能。

      选用数据类型的原则:

      1)选择最小的可用的类型;

      2)从速度方面考虑,选择固定的列  使用CHAR类型;

      3)从节省空间考虑,选择动态的列,使用VARCHAR类型。

      高性能数据库设计原则:

      第一步:大致确定字段的数据类型,数字,字符串,时间等,比较直观。

      第二步:确定特定的类型,比如说 :数字里有TINYINT、SMALLINT、INT、LONGINT等,选择最合适的一个(更小通常更好)

      第三步:如有必要,请为字段设置默认值。

      当然,索引优化肯定是必不可少的,不过这属于设计表完成之后的优化范围了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索MySQL基本数据类型
MySQL数据类型
,以便于您获取更多的相关知识。

时间: 2024-10-29 14:11:07

MySQL学习第六天 学习MySQL基本数据类型_Mysql的相关文章

Mysql学习笔记(一)数据类型

原文:Mysql学习笔记(一)数据类型 学习内容: Mysql基本数据类型. 1.数字类型.. i.整型     Mysql数据类型             含义(有符号)     tinyint(m) 一个字节 范围(-128~127)     smallint(m) 两个字节 范围(-32768~32767)     mediumint(m) 三个字节 范围(-8388608~8388607)     int(m) 四个字节 范围(-2147483648~2147483647)     bi

Mysql学习笔记(二)数据类型 补充

原文:Mysql学习笔记(二)数据类型 补充 PS:简单的补充一下数据类型里的String类型以及列类型... 学习内容: 1.String类型 2.列类型存储需求   String类型: i.char与varchar char与varchar的类型相似,但是他们的保存方式和检索方式不同... char的存储结构是固定长度的存储...即指定了几个字节,那么就占用几个字节,如char(4),那么无论存入的是什么字串,那么都占用四个字节...char的 可表示长度范围为0-255的任何值,当保存的字

MySQL 5.7 学习心得之安全相关特性_Mysql

1,账号安全相关的特性 1.1:创建用户 5.7版本的用户表mysql.user要求plugin字段非空,且默认值是mysql_native_password认证插件,并且不再支持mysql_old_password认证插件.5.7用户长度最大为32字节,之前最大长度为16字节,并且CREATE USER 和 DROP USER 命令里实现了 IF [NOT] EXISTS 条件判断.5.7之后用户通过grant创建用户报warning.如: grant all on *.* to dxy@lo

我的MYSQL学习心得(四) 数据类型

MYSQL里的BLOB数据类型 BLOB是一个二进制大对象,用来存储可变数量的数据.BLOB类型分为4种:TinyBlob.Blob.MediumBlob.LongBlob, 这几个类型之间的唯一区别是在存储文件的最大大小上不同.   MySQL的四种BLOB类型     类型 大小(单位:字节) TinyBlob                            最大 255 Blob                                  最大 65K MediumBlob  

MySql官方手册学习笔记1 MySql简单上手_Mysql

连接与断开服务器 连接服务器通常需要提供一个MySQL用户名并且很可能需要一个 密码.如果服务器运行在登录服务器之外的其它机器上,还需要指定主机名: shell> mysql -h host -u user -p Enter password: ******** host代表MySQL服务器运行的主机名,user代表MySQL账户用户名,******** 代表你的密码. 如果有效,你应该看见mysql>提示符后的一些介绍信息: shell> mysql -h host -u user -

MYSQL的select 学习笔记_Mysql

记录一些select的技巧: 1.select语句可以用回车分隔 $sql="select * from article where id=1" 和 $sql="select * from article      where id=1",都可以得到正确的结果,但有时分开写或许能更明了一点,特别是当sql语句比较长时 2.批量查询数据 可以用in来实现 $sql="select * from article where id in(1,3,5)"

如何安装mysql?刚刚学习php不会用mysql,请高手指教

问题描述 如何安装mysql?刚刚学习php不会用mysql,请高手指教 如何安装mysql?刚刚学习php不会用mysql,请高手指教 解决方案 新手用集成环境,xmapp或phpnow 各关联自动完成 关于mysql的安装步骤参见: http://www.jb51.net/article/23876.htm 解决方案二: 安装的时候点击下一步.下一步,中间有几个环节需要注意: 1.端口号,默认为3306,可以根据实际情况修改. 2.用户名和密码,需要设置,在程序连接的时候需要. 3.字符集,

学习Oracle和MySQL推荐的几本书

   已经很多次收到后台网友的留言或者私信了,对于学习Oracle和MySQL,他们都有类似的疑问,我就索性放在一起来回答下.    简单来说,官方文档是最好的学习资料,在这个基础上去阅读更多的书籍会起到融会贯通的作用,而相比Oracle和MySQL,Oracle的文档要更细更全,如果你去官网下载完整的文档,会被里面的文档淹没.而MySQL的文档相对来说要少一些,但是诚意十足,比如MySQL Internal,如何设计存储引擎这类的文档官方都会提供,Oracle就别想了,多年前的DSI现如今已经

学习使用数据库MySQL

mysql|数据|数据库 [摘要]:MySQL是一个遵循GPL的开源软件.在Linux平台底下它是LAMP(LAMP 在英语中是"灯"的意思,但是在 IT 行业当然不是那么简单的一个意思了.这个术语在德国十分流行.代表了 Linux 平台上的 Apache 网站服务器;MySQL 数据库以及 Perl .Python 或者 PHP 编程语言的结合)组合重要组成部分.同时它提供的C API可以结合Glade/GTK+,可以代替Windows平台的VB+ACCESS/MS SQL SERV