MySQL 数据库的数据类型

MySQL 是一个 关系型数据库,这种所谓的"关系型"可以理解为"表格"的概念, 一个关系型数据库由一个或数个表格组成, 如图所示的一个表格:

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

  1. char(n) 若存入字符数小于 n,则以空格补于其后,查询之时再将空格去掉。所以 char 类型存储的字符串末尾不能有空格,varchar不限于此
  2. char(n) 固定长度,char(4)不管是存入几个字符,都将占用4个字节,因为 char 会后面补空格,所以 n 就一定是占用长度。varchar 是存入的 实际字符数+1个字节(n<=255)或2个字节(n>255),所以varchar(4),存入3个字符将占用4个字节。
  3. char 类型的字符串检索速度要比 varchar 类型的快。

varchar 和 text

  1. varchar可指定n,text不能指定,内部存储varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),text是实际字符数+2个字节。
  2. text类型不能有默认值。
  3. varchar可直接创建索引,text创建索引要指定前多少个字符。varchar查询速度快于text,在都创建索引的情况下,text的索引似乎不起作用。

6、二进制数据:blob

  1. blob 和 text 存储方式不同,text 以文本方式存储,英文存储区分大小写,而 blob 是以二进制方式存储,不分大小写。
  2. blob 存储的数据只能整体读出。
  3. 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 的语法

  1. 不区分大小写,但建议关键字大写,表名、列名小写。(关键字就是,上面的 数据类型 和 属性,都是关键字)
  2. 每条命令最好用分号;结尾。
  3. 每条命令根据需要,可以进行缩进,或者换行(建议关键字放一行,要要查询的放一行)。
  4. 注释
    单行注释:# 注释文字
    多行注释:/* 注释文字 */