1.MySQL的数据类型
数据类型是定义列中可以存储什么类型的数据以及该数据实际怎样存储的基本规则;
数据类型限制存储在数据列列中的数据。例如,数值数据类型列只能接受数值类型的的数据;
在设计表时,应该特别重视所用的数据类型。使用错误的数据类型可能会严重地影响应用程序的功能和性能;
更改包含数据的列不是一件小事(而且这样做可能会导致数据丢失);所以定义完就最好不要更改;
数据类型:整型、浮点型、字符串、日期等。
1.1 字符串数据类型:char,varchar
最常用的数据类型是字符串数据类型。它们存储串,如名字、地址、电话号码、邮政编码等。
不管使用何种形式的串数据类型,串值都必须括在引号内;
有两种基本的串类型,分别为定长字符串和变长字符串:
-
定长串:char
-
接受长度固定的字符串,其长度是在创建表时指定的。
定长列不允许存储多于指定长度字符的数据。
-
指定长度后,就会分配固定的存储空间用于存放数据
-
char(7) 不管实际插入多少字符,它都会占用7个字符位置
- 变长串:varchar
- 存储可变长度的字符串;
- varchar(7) 如果实际插入4个字符, 那么它只占4个字符位置,当然插入的数据长度不能超过7个字符。
- 变长文本类型存储:text
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l8Kf4voa-1596703747910)(D:\学习笔记\放在typora里的图片\3232559721674152AA6C45916CE1C086.png)]
###注意
问:既然变长数据类型这样灵活,为什么还要使用定长数据类型?
答:因为性能,MySQL处理定长列远比处理变长列快得多。
1.2 数值类型:int等
数值数据类型存储数值。MySQL支持多种数值数据类型,每种存储的数值具有不同的取值范围。支持的取值范围越大,所需存储空间越多。
与字符串不一样,数值不应该括在引号内。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PeU7DXGK-1596703747912)(D:\学习笔记\放在typora里的图片\3D63395B658D42489CE95C2157C15213.png)]
-
int 4字节; -21亿~21亿 or 0-42亿
-
tinyint 1字节(8位); -128~127 or 0-255
-
float
-
decimal(5, 2) 表示数值总共5位, 其中小数占2位
MySQL中没有专门存储货币的数据类型,一般情况下使用DECIMAL(8, 2)
有符号或无符号
所有数值数据类型(除BIT和BOOLEAN外)都可以有符号或无符号;
- 有符号数值列可以存储正或负的数值
- 无符号数值列只能存储正数。
- 默认情况为有符号,但如果你知道自己不需要存储负值,可以使用UNSIGNED关键字
###注意
如果将邮政编码类似于01234存储为数值类型,则保存的将是数值1234,所以此时需要使用字符串类型;
手机号也应该用字符串来进行存储,因为int最多只能存10位。
1.3 日期和时间类型:datetime
MySQL使用专门的数据类型来存储日期和时间值。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VzBgcgjT-1596703747913)(D:\学习笔记\放在typora里的图片\B493924B597B48D7AE436F5EFFB09DCC.png)]
datetime 8字节1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
##1.4 二进制数据类型
二进制数据类型可存储任何数据(甚至包括二进制信息),如图像、多媒体、字处理文档等。
【不过一般不这么用,一般都把图片等上传到服务器,不会存到数据库,到时候只在数据库里记录文件路径。】
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bUIZmI9j-1596703747915)(D:\学习笔记\放在typora里的图片\B8CCF6C0BCA5402B907D02F8C415B019.png)]
2.表的字段约束
- unsigned 无符号 (给数值类型使用,表示为正数,不写可以表示正负数都可以)
- 字段类型后面加括号限制宽度 :
- char(5)、varchar(7) :在字符类型后面加限制,表示字符串的长度
- int(4) :在int后面加宽度是没有意义的,默认无符号的int为int(11),有符号的int(10)
- int(4) unsigned zerofill :只有当给int类型设置有前导零时,设置int的宽度才有意义。【前导零就是不足4位的时候在前面补0,比如把1补为0001】
- not null 不能为空,在操作数据库时如果输入该字段的数据为NULL ,就会报错
- default 设置默认值
- primary key 主键不能为空,且唯一:一般和自动递增一起配合使用。
- auto_increment 定义列为自增属性,一般用于主键,数值会自动加1
- unique 唯一索引(数据不能重复:用户名)可以增加查询速度,但是会降低插入和更新速度
3.MySQL的运算符
- 算术运算符: +、 -、 *、 /、 %
- 比较运算符: =、 >、 <、 >=、 <=、!=
- 数据库特有的比较: in、not in、is null、is not null、like、between、and
- 逻辑运算符: and、or、not
- like: 支持特殊符号%和_ ; 【用于模糊搜索】
#其中%表示任意数量的任意字符,_表示任意一位字符
-- 比如说查名字但是只知道:姓氏为张,一共两个字
select * from user where name like '张_';
-- 姓氏为张,不知道几个字
select * from user where name like '张%';
4.主键:表中每行都应有可以唯一标识自己的一列
- 表中每一行都应该有可以唯一标识自己的一列,用于记录两条记录不重复,任意两行都具有不同的主键值;
- 应该定义主键,虽然并不总是都需要主键,但大多数数据库设计人员都应保证他们创建的每个表具有一个主键,以便于以后的数据操纵和管理。
##要求:
- 记录一旦插入到表中,主键最好不要再修改
- 主键不允许NULL
- 不在主键列中使用可能会更改的值。
(例如,如果使用一个名字作为主键以标识某个供应商,当该供应商合并和更改其名字时,必须更改这个主键。)
- 自增整数类型:数据库会在插入数据时自动为每一条记录分配一个自增整数,这样我们就完全不用担心主键重复,也不用自己预先生成主键
可能会更改的值。
(例如,如果使用一个名字作为主键以标识某个供应商,当该供应商合并和更改其名字时,必须更改这个主键。)
- 自增整数类型:数据库会在插入数据时自动为每一条记录分配一个自增整数,这样我们就完全不用担心主键重复,也不用自己预先生成主键
- 可以使用多个列作为联合主键,但联合主键并不常用。使用多列作为主键时,所有列值的组合必须是唯一的