MySql入门学习 DAY39(数据存储引擎 表相关 数据类型)

MySql入门学习(数据库mysql)

DAY39

今日内容:

数据存储引擎

创建数据库表

数据库数据类型

参考文章:http://www.cnblogs.com/linhaifeng/articles/7232894.html#_label1

数据存储引擎

1. 数据存储引擎:就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方
法.因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和
操作此表的类型)

Mysql中
数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据
自己的需要编写自己的存储引擎

可以在mysql中输入show engines 查看存储引擎

MySql入门学习 DAY39(数据存储引擎 表相关 数据类型)

可以在创建表时在最后指定引擎名称  (engine = 引擎名称)

MySql入门学习 DAY39(数据存储引擎 表相关 数据类型)

我们可以在mysql软件中的data文件夹下找到我们创建的库 和 库中的表

MySql入门学习 DAY39(数据存储引擎 表相关 数据类型)

发现后两种存储引擎只有表结构,无数据
db.opt  t1.frm  t1.ibd  t2.MYD  t2.MYI  t2.frm  t3.frm  t4.frm

总结:

memory:在重启mysql或者重启机器后,表内数据清空

blackhole:往表内插入任何数据,都相当于丢入黑洞,表内永远不存记录

innodb :mysql默认的存储引擎,因为innodb引擎是永久存储 并且支持事务,行锁,外键

创建数据库表

创建表的语法

create table 表名 (

字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件]

);

MySql入门学习 DAY39(数据存储引擎 表相关 数据类型)

必须:字段名  数据类型  表名  
可选:宽度 约束条件 

注意:

1. 在同一张表中,字段名是不能相同

2. 宽度和约束条件可选

3. 字段名和类型是必须的

4. 字段名 和 表名  库名  都不能是mysql的关键字

数据库数据类型

mysql常用数据类型

整型:默认情况下整型是有符号的 用一个二进制位存储符号,我们可以给整型

加上约束 unsigned 来表示无符号

MySql入门学习 DAY39(数据存储引擎 表相关 数据类型)

tinyint:小整数,用于保存一定范围内的整数

          有符号: -128 ~127

          无符号: 0 ~ 255

int: 整数,用于保存一定范围内的整数

          有符号: -2147483648 ~ 2147483647

          无符号:  0 ~ 4294967295

bigint:大整数,用于保存一定范围内的整数

          有符号: -9223372036854775808 ~ 9223372036854775807

          无符号:  0 ~ 18446744073709551615

如果数据超出范围就尽可能保存最大的 例如 在无符号下 保存256  其实存的255
如果有符号  例如 tinyint  保存-129 其实存的是-128  是最小值
以上特性的出现是因为 mysql处于非严格模式
查看当前模式  show variables like "sql_mode";

MySql入门学习 DAY39(数据存储引擎 表相关 数据类型)
修改为严格模式  set global sql_mode = "STRICT_TRANS_TABLES";
严格模式下:
如果值超出范围就直接报错,在一些版本中默认就是严格模式

int的存储宽度是4个Bytes,即32个bit,即2**32

无符号最大值为:4294967296-1

有符号最大值:2147483648-1

有符号和无符号的最大数字需要的显示宽度均为10,而针对有符号的最小值则需要11位才能显示完全,

所以int类型默认的显示宽度为11是非常合理的

最后:整形类型,其实没有必要指定显示宽度,使用默认的就ok

浮点型:

float:  float(m,n) 单精度浮点数,m是数字总个数,n是小数部分个数,m最大为255,n最大为30

例: float(5,3)   最大值为 99.999

有符号:-3.402823466E+38 to -1.175494351E-38,1.175494351E-38 to 3.402823466E+38

无符号: 1.175494351E-38 to 3.402823466E+38

MySql入门学习 DAY39(数据存储引擎 表相关 数据类型)

精确度: 随着小数的增多,精度变得不准确 

 

double: double(m,n) 双精度浮点数,m是数字总个数,n是小数部分个数,m最大为255,n最大为30

有符号:-1.7976931348623157E+308 to -2.2250738585072014E-308, 2.2250738585072014E-308 to 1.7976931348623157E+308

无符号: 2.2250738585072014E-308 to 1.7976931348623157E+308

精确度:随着小数的增多,精度比float要高,但也会变得不准确 

 

decimal:准确的小数值,m是数字总个数,n是小数点后个数。 m最大值为65,d最大值为30。

精确度: 随着小数的增多,精度始终准确 
对于精确数值计算时需要用此类型
decaimal能够存储精确值的原因在于其内部按照字符串存储。

字符串类型:

char:   定长  存取速度快  但  浪费空间

字符长度范围:0-255(一个中文是一个字符,是utf8编码的3个字节)

存储:存储char类型的值时,会往右填充空格来满足长度

例如:指定长度为10,存>10个字符则报错,存<10个字符则用空格填充直到凑够10个字符存储

检索:在检索或者说查询时,查出的结果会自动删除尾部的空格

除非我们打开pad_char_to_full_length

SQL模式(SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';)

 

varchar:  变长  精准  节省空间  但  存取速度慢

字符长度范围:0-65535如果大于21845会提示用其他类型 

mysql行最大限制为65535字节,字符编码为utf-8

存储:varchar类型存储数据的真实内容,不会用空格填充,如果'ab  ',尾部的空格也会被存起来

强调:varchar类型会在真实数据前加1-2Bytes的前缀,该前缀用来表示真实数据的bytes字节数

(1-2Bytes最大表示65535个数字,正好符合mysql对row的最大字节限制,即已经足够使用)

如果真实的数据<255bytes则需要1Bytes的前缀(1Bytes=8bit 2**8最大表示的数字为255)

如果真实的数据>255bytes则需要2Bytes的前缀(2Bytes=16bit 2**16最大表示的数字为65535)

 检索: 尾部有空格会保存下来,在检索或者说查询时,也会正常显示包含空格在内的内容

char和varchar 长度都比较小 最大就是65535

其他:

大文本类型:

TEXT系列 TINYTEXT TEXT MEDIUMTEXT LONGTEXT     文本是带有编码

BLOB 系列    TINYBLOB BLOB MEDIUMBLOB LONGBLOB 也是字符数据 但是不带编码

二进制类型: 用于存储多媒体数据 比如视频   但是我们一般不会将多媒体数据存到数据

而是存储文件路径地址

BINARY系列 BINARY VARBINARY    存储二进制数据
 

日期型:

分类
time   时分秒  

MySql入门学习 DAY39(数据存储引擎 表相关 数据类型)

year   年份     

MySql入门学习 DAY39(数据存储引擎 表相关 数据类型)

date   日期  年月日   

MySql入门学习 DAY39(数据存储引擎 表相关 数据类型)

datetime 日期加时间 年月日 时分秒     年份最大是9999  

MySql入门学习 DAY39(数据存储引擎 表相关 数据类型)

timestamp 时间戳  从1970-1-1开始算    年份最大是2037   

MySql入门学习 DAY39(数据存储引擎 表相关 数据类型)

共同点: 时间的存取通过字符串类型都可以使用now()函数来插入当前时间

datetime 和 时间戳都能够表示日期和时间

不同之处是:

年份最大范围不同

时间戳可以为空 代表当前时间

时间戳在你更新记录时 会自动更新为当前时间
 

集合和枚举:

枚举 : 用于描述 一个已知范围的数据 如性别只有男 女 

例: enum("man","woman")

总结:

枚举中只能是字符串类型

添加的数据只能是已经出现在枚举中的值

你的值只能是其中的一个

你也可以使用枚举值的序号来插入值 从1开始

 

集合 :用于描述一堆数据  比如你的兴趣爱好

例: set("watch movie","listen music","play game")

总结:

集合中的数据 只能是字符串

添加的数据只能是已经出现在集合中的值

你的值可以是其中的任意几个

你也可以使用枚举值的序号来插入值 从1开始   但是只能给一个序号
 

以上为本次学习内容