MySQL-进阶-3

8.1 MySQL中的数据类型

1、字符串类型

  • CHAR:定长字符串,最多255bytes
  • VARCHAR:变长字符串,最多存储65535个字节(64KB),比较常用的字符串类型,小型长度使用VARCHAR(50),更长的使用VARCHAR(255)
  • MEDIUMTEXT:最多16MB
  • LONGTEXT:最多4GB
  • TINYTEXT:最多255bytes
  • TEXT:最多64KB

在MySQL中char(n)和varchar(n)中的n表示的都是字符数,其中char中的n最大长度是255个字符,如果是utf8编码方式, 那么char类型占255 * 3个字节。(utf8下一个字符占用1至3个字节,英文一个欧洲地区文两个中文三个)。
varchar最大空间是65535个字节, 存放字符数量跟字符集有关系;varchar实际范围是65532或65533, 因为内容头部会占用1或2个字节保存该字符串的长度;如果字段default null(即默认值为空),整条记录还需要1个字节保存默认值null。如果是utf8编码, 那么varchar最多存65532/3 = 21844个字符。
char:存储定长数据很方便,CHAR字段上的索引效率级高,必须在括号里定义长度,可以有默认值,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间(自动用空格填充),且在检索的时候后面的空格会隐藏掉,所以检索出来的数据需要记得用trim之类的函数去过滤空格。
varchar:存储变长数据,但存储效率没有CHAR高,必须在括号里定义长度,可以有默认值。保存数据的时候,不进行空格自动填充,而且如果数据存在空格时,当值保存和检索时尾部的空格仍会保留。另外,varchar类型的实际长度是它的值的实际长度+1,这一个字节用于保存实际使用了多大的长度。
text:存储可变长度的非Unicode数据,最大长度为2^31-1个字符。text列不能有默认值,存储或检索过程中,不存在大小写转换,后面如果指定长度,不会报错误,但是这个长度是不起作用的,意思就是你插入数据的时候,超过你指定的长度还是可以正常插入。
1、 char长度固定, 即每条数据占用等长字节空间;适合用在身份证号码、手机号码等定长串。2、 varchar可变长度,可以设置最大长度;适合用在长度可变的属性。3、 text不设置长度, 当不知道属性的最大长度时,适合用text

2、整数类型

  • TINYINT:1b,[-128, 127]
  • SMALLINT:2b,[-32K, 32K]
  • MEDIUMINT:3b,[-8M, 8M]
  • INT:4b,[-2B, 2B]
  • BIGINT:8b,[-9Z, 9Z]

UNSIGNED就不用我说了吧你肯定懂的、另一个特性关键字是ZEROFILL,补零,当存储数字数位少于int_type(M)中的M时,自动在高位补零。补零只是一种标准化的输出格式方式,并不会影响数据的存储格式,正确的类型定义格式:int_type [UNSIGNED] [ZEROFILL]

3、小数类型

  • DECIMAL:定长小数类型,DECIMAL(p, s):两个参数p决定该数总共的数位,s决定小数点后的数位
  • FLOAT:不定长,4b
  • DOUBLE:不定长,8b,与FLOAT一样在存储中只能存储近似值无法存储精确值

4、布尔值
BOOL或BOOLEAN:TRUE和FALSE

5、枚举类型

  • ENUM:常用枚举类型,ENUM(value1, value2, ...),只可取单值
  • SET:可取多值的枚举类型
  • 非常不推荐使用枚举类型,在表的连接、增扩成员等方面麻烦很大。于与其使用枚举类型还不如建一张反应枚举关系的表然后在其它表中用数字替代、方便明了

6、日期时间函数

  • DATE:格式:YYYY-MM-DD
  • TIME:格式:HH:MM:SS
  • DATETIME:日期时间混合值,YYYY-MM-DD HH:MM:SS,8b
  • TIMESTAMP:时间戳,4b,结束时间2038年
  • YEAR:年份值,YYYY

7、二进制字符串类型
二进制字符串类型用于存储文件,但把文件存储于数据库中是一个很不明智的选择,不推荐使用

  • TINYBLOB:255b
  • BLOB:64KB
  • MEDIUMBLOB:16MB
  • LONGBLOB:4GB

8、JSON类型
想睡午觉、、、之后再来补坑吧

9、参考链接:菜鸟教程-数据类型

9.1 数据库创建
三种结构:概念结构、逻辑结构、物理结构;流程图的重要性

9.7 外键

  • 外键是其他表中的主键
  • 注意表的父子关系,譬如学生和课程两表,可以派生出一张选课表,这张表既连接学生表也连接课程表,且都是一对多,达到实体关系中学生和课程的多对多。正是这种父子关系引出了外键。
  • 在连接两张表的关系时,一端为父表(主键表)另一张为子表(外键表),子表因父表而存在。连接关系时先接子表再接父表(MySQL左下角状态栏也有相应的提示)
  • MySQL可视化左侧查看中可以看见外键集的名字,MySQL的命名规则是fk_locatedTable_referedTable,从名字可以看出关系。中间则是每个外键中的具体外键,分别是其外键名和主键名
  • 最右侧上方的一致性面板较为重要,有Update和Delete两种选项栏,都有四个选项,其控制了当主键发生变化时,外键应该发生什么变化。四个选项:CASCADE:使得外键跟随主键变化而变化(更新而更新、删除而删除);SET NULL:会把主键发生了变化对应外键设为空值,这会导致孤儿记录的产生,因应该极力避免的;而NO ACTION和RESTRICT都会阻止主键的变化。一般对于更新设CASCADE而删除则视情况而定,一般是RESTRICT、无论如何不应该设SET NULL

9.9 数据库三大范式
数据库有六大来规范数据库的创建、结构等等,等级越来越高要求也越来越严格完美。而一般数据库只需满足前三个范式即可。
9.10 第一范式(1NF)
属于第一范式关系的所有属性都不可再分,即数据项不可分。 第一范式强调数据表的原子性,是其他范式的基础。eg.商品一列下有数量和单价两个子列是不允许的,应该将它们拆开成商品数量和商品单价两个列;又课程有一个标签列是不合理的,因为标签可以有很多个,应该建议一张标签表和课程形成多对多关系
9.12 第二范式(2NF)
每张表用来描述一个实体,并且这张表的字段都应该是描述该实体本身的属性。eg.再orders表中不应该出现customer_name而应该出现customer_id,name的出现会导致空间的浪费和更新的繁杂,应该用id这种几乎不会变的属性,其余的客户属性应该在customers表中与id对应
9.13 第三范式(3NF) 表中的任意一列都不应该是由其它列派生而出的,应该是独立的。eg.有了invoice_total和payment_total,则不应该有balance,因为它可以在需要时随时被invoice_total-payment_total计算出;有了first_name和last_name则不需要有full_name了。

9.16 MySQL可视化建库
File -> New Model -> Add Diagram:建立model
Database -> Forward Engineering -> 注意存储位置:依照流程图建库
9.17 更改数据库结构
直接在左侧导航栏可视化更改进行的话,更改只会在自己的机器上生效,无法同步到其它服务器。正确的做法是:在保存好的model中进行修改,之后 Database -> Synchronize Model 进行更新
9.18 如何修改没有Model的数据库结构?
使用 Database -> Reverse Engineering 可以逆向产生Model并依次做出修改
给自己的一点知识补充:虚实线的区别 在MySQL的EER model viewer里, 虚线表示的是non-identify relationship, 而实线表示的是identify relationship;identify relationship表示的是子表格和母表格之间有很强的联系,子表不可以在没有主表的情况下存在。子表的外键也是它的主键。non-identify relationship子表和母表的关系比较弱,子表的外键不是它的主键

9.25 创建和删除数据库
创建一个空的数据库:CREATE DATABASE IF NOT EXISTS database_name; 删除数据库(删库跑路2333):DROP DATABASE IF EXISTS database_name 9.26 创建表格

USE database_name;
DROP TABLE IF EXISTS table_name;
CREATE TABLE table_name
(
	column_1 typename [attribute],
	column_2 typename [attribute],
	...
); -- 创建表格格式

每个列的attribute都是可选的,包括以下这些特性:主键:PRIMARY KEY、自增:AUTO_INCREMENT、不能为空:NOT NULL、值不能重复:UNIQUE、设缺省值:DEFAULT default_value 9.27 修改表格结构

ALTER TABLE table_name
	ADD column_1 typename [attribute] [location], --增加列
	MODIFY column_2 typename [attribute] [location], --更新列
	DROP column_3; --删除列

loaction:位置,可选的。将该列放于指定位置,可以是FIRST第一,或者AFTER column某列之后
9.28 创建外键及关系

CREATE TABLE childTableName
(
	...
	FOREIGN KEY fk_childTableName_parentTableName (childColumn)
		REFERENCES parentTableName (parentColumn)
		ON UPDATE options
		ON DELETE options
) --请遵守外键集的命名方式,这也是MySQL的命名方式

9.29 更新外键、主键

ALTER TABLE table_name
	DROP PRIMARY KEY,
	ADD PRIMARY KEY (column_1, column_2, ...),
	DROP FOREIGN KEY fk_childTableName_parentTableName,
	ADD FOREIGN KEY fk_childTableName_parentTableName (childColumn)
		REFERENCES parentTableName (parentColumn)
		ON UPDATE options
		ON DELETE options
;

9.30 字符集和排序方式
MySQL支持可视化修改字符集和排序方式,你肯定的小胡。
查看MySQL支持的字符集及排序方式:SHOW CHARSET [LIKE 'string'] 创建/修改数据库及字符集:CREATE/ALTER db_name CHARACTOR SET charset_name 创建/修改表格及字符集:CREATE TABLE (...) CHARACTER SET charset_name;ALTER TABLE CHARACTER SET charset_name; 创建/修改列及数据集,在创建/更新列时:column_name typename CHARACTER SET charset_name [attribute] [location]

9.31 存储引擎
SHOW ENGINES:查看MySQL支持的所有存储引擎,最出名的两个:MyISAM和InnoDB,前者老旧,后者强大且范围广。存储引擎是表级的,同一数据库每张表可以设定不同的存储引擎。更换表的存储引擎:ALTER TABLE table_name ENGINE = engine_name;不要轻易尝试更改存储引擎,更改时MySQL需要花大量时间重建表格,而在此期间,表格也将不可用

最后一点扩展tips:
MODIFY和CHANGE:
相同点:都是用来改变column的属性,change和modify执行成功后都会这本次设置的属性替换column原属性,请注意是【替换】;
不同点:重命名只能使用change;
格式:ALTER TABLE table_name CHANGE current_column_name new_column_name type ...ALTER TABLE table_name MODIFY column_name type ...