Mysql学习内容
1.数据类型
2.部分函数
3.事务
4.调优(索引和优化)
5.内部原理
6.储存引擎
1.MySQL 数据类型
MySQL 中定义数据字段的类型对你数据库的优化是非常重要的。
MySQL 支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
a.数值型
数值型有整数和浮点数之分
b.时间类型
表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR
Mysql中timestamp的格式为"YYYY-MM-DD:HH-MM-SS",显示宽度是19个字符,如果你在insert的时候指定(null),那么它会自动显示为当前操作的时间。但是如果你在insert操作的时候没有插入数据,那么默认为0000-00-00 00-00-00,TIMESTAMP 类型使用 4 个字节,范围是 ‘1970-01-01 00:00:01.000000’ 到 ‘2038-01-19 03:14:07.999999’ 。
如果定义timestamp类型字段时,使用参数DEFAULT CURRENT_TIMESTAMPON和UPDATE CURRENT_TIMESTAMP 子句,列值为默认使用当前的时间戳,并且自动更新
- 占用4个字节
- 允许为空值,但是不可以自定义值,所以为空值时没有任何意义。
- TIMESTAMP值不能早于1970或晚于2037。这说明一个日期,例如’1968-01-01’,虽然对于DATETIME或DATE值是有效的,但对于TIMESTAMP值却无效,如果分配给这样一个对象将被转换为0。
- 默认值为CURRENT_TIMESTAMP(),其实也就是当前的系统时间。
- 数据库会自动修改其值,所以在插入记录时不需要指定timestamp字段的名称和timestamp字段的值,你只需要在设计表的时候添加一个timestamp字段即可,插入后该字段的值会自动变为当前系统时间。
- 默认情况下以后任何时间修改表中的记录时,对应记录的timestamp值会自动被更新为当前的系统时间。
- 如果需要可以设置timestamp不自动更新。通过设置DEFAULT CURRENT_TIMESTAMP不写UPDATE CURRENT_TIMESTAMP 可以实现。
c.字符类型
字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET
char和varchar的区别面试中遇到过
1.char和varchar的区别
char是固定长度的,而varchar会根据具体的长度来使用存储空间,另外varchar需要用额外的1-2个字节存储字符串长度。
1). 当字符串长度小于255时,varchar用额外的1个字节来记录长度
2). 当字符串长度大于255时,varchar用额外的2个字节来记录长度
比如char(255)和varchar(255),在存储字符串"hello world"时,char会用一块255个字节的空间放那个11个字符;而varchar就不会用255个,它先计算字符串长度为11,然后再加上一个记录字符串长度的字节,一共用12个字节存储,这样varchar在存储不确定长度的字符串时会大大减少存储空间。
2、char和varchar的使用场景
1). 从字符长度的角度考虑:
(1). 长度较短的字段,使用char。如门牌号:101,201,...
(2). 固定长度的字段,使用char。如性别、身份证号、手机号等。(因为数据都是固定长度,varchar根据长度动态存储的特性就没作用了,而且还要占一个字节来存储长度)
(3). 字段的长度是否相近,如果某个字段其长度虽然比较长,但是其长度总是近似的,如一般在90个到100个字符之间,甚至是相同的长度。此时比较适合采用CHAR字符类型。
2). 从碎片角度考虑:
使用CHAR时,由于存储空间都是一次性分配的。从这个角度来讲,不存在碎片的困扰。而使用varchar时,因为存储的长度是可变的,当数据长度在更改前后不一致时,就不可避免地会出现碎片的问题。故使用varchar时,数据库管理员要时不时的对碎片进行整理。如执行数据库导出导入作业来消除碎片。
3). 即使使用Varchar数据类型,也不能够太过于慷慨。
虽然varchar可以自动根据长度调整存储空间,但是varchar(100)和varchar(255)还是有区别的:
假设它们都存储了90个字符的数据,那么它们在磁盘上的存储空间是相同的(硬盘上的存储空间是根据实际字符长度来分配存储空间的)。但对于内存来说,则不是这样的,内存是使用varchar中定义的长度(这里为100或255)的内存块来保存值。
所以如果某些字段会涉及到文件排序或者基于磁盘的临时表时,分配VARCHAR的长度时仍然不能过于慷慨,需要评估实际需要的长度,然后设置一个合适的长度,不能随意设置长度。