MySQL 中存的是数据。只要是数据,我们就会规定数据的类型。
在表的字段中规定了使用的是某个数据类型。那么,在插入的数据中就要使用对应的数据类型。并且,遵守数据类型的长度要求。

所有数据类型

  • 数值类型
    • 整型
    • 浮点型
  • 字符串类型
  • 日期时间类型
  • 复合类型
  • 空间类型(用的不多)

整型

MySQL 数据类型 所占字节 值范围
tinyint 1 字节 -127~128
smallint 2 字节 -32768~32767
mediumint 3 字节 -8388608~8388607
int 4 字节 -2147483648~2147483647
bigint 5 字节 +-9.22*10 的 18 次方

整型长度不同,在实际使用过程也不同

MySQL 以一个可选的显示宽度指示器的形式对 SQL 标准进行扩展,这样当从数据库检索一个值时,可以把这个值加长到指定的长度。例如,指定一个字段的类型为 INT(6),就可以保证所包含数字少于 6 个的值从数据库中检索出来时能够自动地用空格填充。需要注意的是,使用一个宽度指示器不会影响字段的大小和它可以存储的值的范围。

在实际使用中,性别我们可以使用无符号的 tinyint 来存储
同样人的年龄也可以,因为年龄没有负数
创建数据表的时候,需要根据实际需求来确定用什么类型

浮点类型

MySQL 数据类型 所占字节 值范围
float(m, d) 4 字节 单精度浮点型,m 总个数,d 小数位
double(m, d) 8 字节 双精度浮点型,m 总个数,d 小数位
decimal(m, d) decimal 是存储为字符串的浮点数

浮点是非准确值,会存在不太准确的情况
decimal 叫做定点数,在 MySQL 内部,本质是用字符串存储的。使用过程中如果存在金额之类精度要求比较高的浮点数存储,建议使用 decimal 类型

字符类型

MySQL 数据类型 所占字节 值范围
CHAR 0-255 字节 定长字符串
VARCHAR 0-255 字节 变长字符串
TINYBLOB 0-255 字节 不超过 255 个字符的二进制字符串
TINYTEXT 0-255 字节 短文本字符串
BLOB 0-65535 字节 二进制形式的长文本数据
TEXT 0-65535 字节 长文本数据
MEDIUMBLOB 0-16 777 215 字节 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215 字节 中等长度文本数据
LOGNGBLOB 0-4 294 967 295 字节 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295 字节 极大文本数据
VARBINARY(M) 允许长度 0-M 个字节的定长字节符串 值的长度+1 个字节
BINARY(M) M 允许长度 0-M 个字节的定长字节符串
  • CHAR 与 VARCHAR

    CHAR 类型用于定长字符串,并且必须在圆括号内用一个大小修饰符来定义,这个大小修饰符的范围从 0-255。比指定长度大的值将被截短,而比指定长度小的值将会用空格作填补。

    VARCHAR 把这个大小视为值的大小,在长度不足的情况下就用空格补足。而 VARCHAR 类型把它视为最大值并且只使用存储字符串实际需要的长度类型不会被空格填补,但长于指示器的值仍然会被截短。因为 VARCHAR 类型可以根据实际内容动态改变存储值的长度,所以在不能确定字段需要多少字符时使用 VARCHAR 类型可以大大地节约磁盘空间、提高存储效率。

  • TEXT 与 BLOB

    text 类型与 blob 类型对于字段长度要求超过 255 个的情况下,MySQL 提供了 TEXT 和 BLOB 两种类型。根据存储数据的大小,它们都有不同的子类型。这些大型的数据用于存储文本块或图像、声音文件等二进制数据类型。TEXT 和 BLOB 类型在分类和比较上存在区别。BLOB 类型区分大小写而 TEXT 不区分大小写。_大小修饰符不用于各种 BLOB 和 TEXT 子类型_。

时间类型

MySQL 数据类型 所占字节 值范围
date 3 字节 日期,格式:2014-09-18
time 3 字节 时间,格式:08:42:30
datetime 8 字节 日期时间,格式:2014-09-18 08:42:30
timestamp 4 字节 自动存储记录修改的时间
year 1 字节 年份

时间类型在 web 系统中用的比较少,很多时候很多人喜欢使用 int 来存储时间。插入时插入的是 unix 时间戳,因为这种方式更方便计算。在前端业务中用 date 类型的函数,再将unix 时间戳转成人们可识别的时间

有些人为了在数据库管理中方便查看,也有人使用 datetime 类型来存储时间。

复合类型

MySQL 数据类型 说明 举例
set 集合类型 set(“member”, “member2″, … “member64″)
enum 枚举类型 enum(“member1″, “member2″, … “member65535″)
  • ENUM

    一个 ENUM 类型只允许从一个集合中取得一个值;而 SET 类型允许从一个集合中取得任意多个值。

    ENUM 类型因为只允许在集合中取得一个值,有点类似于单选项。在处理相互排拆的数据时容易让人理解,比如人类的性别。ENUM 类型字段可以从集合中取得一个值或使用 null 值,除此之外的输入将会使 MySQL 在这个字段中插入一个空字符串。另外如果插入值的大小写与集合中值的大小写不匹配,MySQL 会自动使用插入值的大小写转换成与集合中大小写一致的值。

    ENUM 类型在系统内部可以存储为数字,并且从 1 开始用数字做索引。一个 ENUM 类型最多可以包含 65536 个元素,其中一个元素被 MySQL 保留,用来存储错误信息,这个错误值用索引 0 或者一个空字符串表示。

    MySQL 认为 ENUM 类型集合中出现的值是合法输入,除此之外其它任何输入都将失败。这说明通过搜索包含空字符串或对应数字索引为 0 的行就可以很容易地找到错误记录的位置

  • SET

    SET 类型与 ENUM 类型相似但不相同。SET 类型可以从预定义的集合中取得任意数量的值。并且与 ENUM 类型相同的是任何试图在 SET 类型字段中插入非预定义的值都会使 MySQL 插入一个空字符串。如果插入一个即有合法的元素又有非法的元素的记录,MySQL 将会保留合法的元素,除去非法的元素。

    一个 SET 类型最多可以包含 64 个元素。在 SET 元素中值被存储为一个分离的“位”序列,这些“位”表示与它相对应的元素。“位”是创建有序元素集合的一种简单而有效的方式。并且它还去除了重复的元素,所以**SET 类型中不可能包含两个相同的元素希望从 SET 类型字段中找出非法的记录只需查找包含空字符串或二进制值为 0 的行。**

使用类型

在字段名后面跟上类型即可使用,例如

1
2
3
4
5
6
7
8
create table if not exists user (
id int(11) not null,
username varchar(50) not null,
password varchar(30) not null,
content longtext not null,
create_at datetime not null,
sex tinyint(4) not null
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

字段其他属性

UNSIGNED(无符号)

主要用于整型和浮点类型,使用无符号。即,没有前面面的-(负号)。存储位数更长。
tinyint 整型的取值区间为,-128~127。而使用无符号后可存储 0-255 个长度。
创建时,在整型或浮点型字段语句后接上

1
unsigned

ZEROFILL(0 填充)

0(不是空格)可以用来真补输出的值。使用这个修饰符可以阻止 MySQL 数据库存储负值。
创建时在整型或浮点字段语句后接上:

1
zerofill

default(默认值)

default 属性确保在没有任何值可用的情况下,赋予某个常量值,这个值必须是常量,因为 MySQL 不允许插入函数或表达式值。此外,此属性无法用于 BLOB 或 TEXT 列。如果已经为此列指定了 NULL 属性,没有指定默认值时默认值将为 NULL,否则默认值将依赖于字段的数据类型。
用法:

1
defalut '默认值'

NOT NULL(不能为 null)

如果将一个列定义为 not null,将不允许向该列插入 null 值。建议在重要情况下始终使用 not null 属性,因为它提供了一个基本验证,确保已经向查询传递了所有必要的值。

1
not null

null

null 为列指定 null 属性时,该列可以保持为空,而不论行中其它列是否已经被填充。记住,null 精确的说法是“无”,而不是空字符串或 0。
声明的时候不是not null即可