MySQL 是一个 关系型数据库,这种所谓的"关系型"可以理解为"表格"的概念, 一个关系型数据库由一个或数个表格组成, 如图所示的一个表格:
关系型数据库,有点类似于一个 excel 文件,也就是,一个数据库 是一个 excel 文件,其中 可以包含很多个表,而表中保存具体的数据。
其中,表的第一行,就是表头,记录了我们要保存数据信息的类型,比如说 name 就是保存名字,sex 就是性别。
然后下面的每一行,就是 一条数据的信息(我们这里记录的是一名学生的信息),就包括 学号,姓名,电话等等。
我们可以发现,一条数据中,可以包含不同的数据类型,即有 数字(学号,年龄),也有字符串(名字,性别)。
所以我们需要,先学习一下,MySQL 数据库中的,都有哪些数据类型,也就是,保存的数据,可以是保存成什么类型。
MySQL提供更多的数据类型,而不仅仅是数字或字符串。 MySQL中的每种数据类型都可以通过以下特征来确定:
- 它用来表的 示数据值。
- 占用的空间 以及 值是固定长度还是可变长度。
- 数据类型的值可以被索引。
- MySQL 如何比较特定数据类型的值。
1、整型
MySQL 数据类型 | 含义(有符号) |
---|---|
tinyint(m) | 1个字节 范围(-128~127)(-2^8 ~ 2^8-1) |
smallint(m) | 2个字节 范围(-32768~32767) |
mediumint(m) | 3个字节 范围(-8388608~8388607) |
int(m) | 4个字节 范围(-2147483648~2147483647) |
bigint(m) | 8个字节 范围(±9.22*10的18次方) |
取值范围如果加了 unsigned(对数据类型的约束,可以与数据类型结合使用),则最大值翻倍,如 tinyint unsigned 的取值范围为(0~256)。
int(m) 里的 m 是表示 SELECT 查询结果集中的显示宽度,并不影响实际的取值范围,没有影响到显示的宽度,不知道这个m有什么用。
所以,一般整型的这里,使用的时候,直接 int,就好,不用加 (m)
1 字节 = 8 bits
2、布尔数据类型
MySQL没有内置的 BOOLEAN 或 BOOL 数据类型。所以要表示布尔值,MySQL使用最小的整数类型,也就是TINYINT(1)。 换句话说,BOOLEAN 和 BOOL 是TINYINT(1)的同义词。
其实也就是 0 表示 false,1 表示 true
3、浮点型:float、double
MySQL 数据类型 | 含义 |
---|---|
float(m,d) | 单精度浮点型 8位精度(4字节) m总个数,d小数位 |
double(m,d) | 双精度浮点型 16位精度(8字节) m总个数,d小数位 |
设一个字段定义为float(5,3),如果插入一个数123.45678,实际数据库里存的是123.457,但总个数还以实际为准,即6位。
也就是说,对于浮点数,就是只用在意保留的小数位 d,对于总长度 m 是由实际为准的。
4、定点数:decimal
浮点型在数据库中存放的是近似值,而定点类型在数据库中存放的是精确值。
MySQL 数据类型 | 含义 |
---|---|
decimal(m,d) | 参数 m < 65 是总个数,d < 30 且 d < m 是小数位 |
5、字符串
MySQL 数据类型 | 含义 |
---|---|
char(n) | 固定长度,最多255个字符 |
varchar(n) | 固定长度,最多65535个字符 |
tinytext | 可变长度,最多255个字符 |
text | 可变长度,最多65535个字符 |
mediumtext | 可变长度,最多2的24次方-1个字符 |
longtext | 可变长度,最多2的32次方-1个字符 |
一个字符,就是占用一个字节
char 和 varchar
- char(n) 若存入字符数小于 n,则以空格补于其后,查询之时再将空格去掉。所以 char 类型存储的字符串末尾不能有空格,varchar不限于此。
- char(n) 固定长度,char(4)不管是存入几个字符,都将占用4个字节,因为 char 会后面补空格,所以 n 就一定是占用长度。varchar 是存入的 实际字符数+1个字节(n<=255)或2个字节(n>255),所以varchar(4),存入3个字符将占用4个字节。
- char 类型的字符串检索速度要比 varchar 类型的快。
varchar 和 text
- varchar可指定n,text不能指定,内部存储varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),text是实际字符数+2个字节。
- text类型不能有默认值。
- varchar可直接创建索引,text创建索引要指定前多少个字符。varchar查询速度快于text,在都创建索引的情况下,text的索引似乎不起作用。
6、二进制数据:blob
- blob 和 text 存储方式不同,text 以文本方式存储,英文存储区分大小写,而 blob 是以二进制方式存储,不分大小写。
- blob 存储的数据只能整体读出。
- text 可以指定字符集,blob 不用指定字符集。
还有一些,可以看一些这里:https://www.yiibai.com/mysql/data-types.html
7、日期和时间 数据类型
MySQL 数据类型 | 含义 |
---|---|
date | YYYY-MM-DD格式的日期值,如 2008-12-2 , |
time | hh:mm:ss格式的时间值,如 12:25:36 , |
datetime | YYYY-MM-DD hh:mm:ss格式的日期和时间值,如 2008-12-2 22:06:44 |
timestamp | 自动存储记录修改时间(按找 datatime格式自动记录) |
year | YYYY或YY格式的年值 |
若定义一个字段为 timestamp,这个字段里的时间数据会随其他字段修改的时候自动刷新,所以这个数据类型的字段可以存放这条记录最后被修改的时间。(可以用于来记录最后修改时间)
8、数据类型的属性(在定义字段的时候,不仅有数据类型,还有其属性的定义)
MySQL 关键字 | 含义 |
---|---|
NULL | 数据列(字段)可包含 NULL 值 |
NOT NULL | 数据列(字段)不允许包含 NULL 值 |
DEFAULT | 默认值 |
PRIMARY KEY | 主键 |
AUTO_INCREMENT | 自动递增,适用于整数类型 |
UNSIGNED | 无符号 |
CHARACTER SET name | 指定 name 的一个字符集 |
9、MySQL 的语法
- 不区分大小写,但建议关键字大写,表名、列名小写。(关键字就是,上面的 数据类型 和 属性,都是关键字)
- 每条命令最好用分号
;
结尾。 - 每条命令根据需要,可以进行缩进,或者换行(建议关键字放一行,要要查询的放一行)。
- 注释
单行注释:# 注释文字
多行注释:/* 注释文字 */