数值类型
整数类型 | 字节 | 最小值 | 最大值 |
---|---|---|---|
tinyint | 1 | 有符号 -128 (-27) 无符号 0 |
有符号 127 (27-1) 无符号 255 (28-1) |
smallint | 2 | 有符号 -32768 (-215) 无符号 0 |
有符号 32767 (215-1) 无符号 65535 (216-1) |
mediumint | 3 | 有符号 (-223) 无符号 0 |
有符号 (223-1) 无符号 (224-1) |
int integer |
4 | 有符号 (-231) 无符号 0 |
有符号 (231-1) 无符号 (232-1) |
bigint | 8 | 有符号 (-263) 无符号 0 |
有符号 (263-1) 无符号 (264-1) |
浮点数类型 | 字节 | 最小值 | 最大值 |
---|---|---|---|
float | 4 | ±1.175494351E-38 | ±3.402823466E+38 |
double | 8 | ±2.2250738585072014E-308 | ±1.797693134862315i7E+308 |
定点数类型 | 字节 | 描述 |
---|---|---|
dec(m,d) decimal(m,d) |
m + 2 | 最大取值范围与 double 相同,给定 decimal 的有效取值范围由 m 和 d 决定 |
位类型 | 字节 | 最小值 | 最大值 |
---|---|---|---|
bit(m) | 1 ~ 8 | bit(1) | bit(64) |
-
对于整型数据,MySQL 支持在类型名称后面的小括号内指定显示宽度,例如
int(5)
表示当数值宽度小于 5 位的时候在数字前面填满宽度,如果不显示指定宽度则默认为int(11)
。
一般配合zerofill
使用,顾名思义,zerofill
就是用 “0” 填充的意思,也就是在数字位数不够的空间用字符 “0” 填满create table tn (cn int zerofill)
-
所有的整数类型都有一个可选属性
UNSIGNED
(无符号),如果需要在字段里面保存非负数或者需要较大的上限值时,可以用此选项,它的取值范围是正常值的下限取 0,上限取原值的 2 倍。如果一个列指定为zerofill
,则 MySQL 自动为该列添加UNSIGNED
属性 -
整数类型还有一个属性:
AUTO_INCREMENT
。在需要产生唯一标识符或顺序值时,可利用此属性,这个属性只用于整数类型。AUTO_INCREMENT
值一般从 1 开始,每行增加 1。在插入 NULL 到一个AUTO_INCREMENT
列时,MySQL 插入一个比该列中当前最大值大 1 的值。一个表中最多只能有一个AUTO_INCREMENT
列。对于任何想要使用AUTO_INCREMENT
的列,应该定义为NOT NULL
,并定义为PRIMARY KEY
或定义为UNIQUE
键create table tn (cn int auto_increment not null primary key)
-
对于小数的表示,MySQL 分为两种方式:浮点数和定点数。定点数在 MySQL 内部以字符串形式存放,比浮点数更精确,适合用来表示货币等精度高的数据浮点数和定点数都可以用类型名称后加 “( M, D)” 的方式来进行表示,“( M, D)” 表示该值一共显示 M 位数字(整数位+小数位),其中 D 位位于小数点后面, M 和 D 又称为精度和标度。float 和 double 在不指定精度时,默认会按照实际的精度(由实际的硬件和操作系统决定)来显示,而 decimal 在不指定精度时,默认的整数位为 10,默认的小数位为 0
alter table tn add cn float(5,2)
-
对于
BIT(位)
类型,用于存放位字段值,BIT(M)
可以用来存放多位二进制数,M 范围从 1~64,如果不写则默认为 1 位。对于位字段,直接使用SELECT
命令将不会看到结果,可以用bin()
(显示为二进制格式)或者hex()
(显示为十六进制格式)函数进行读取。数据插入 bit 类型字段时,首先转换为二进制,如果位数允许,将成功插入;如果位数小于实际定义的位数,则插入失败alter table tn add cn bit(2) insert into tn (cn) values(1) select bin(cn) from tn
日期时间类型
类型 | 字节 | 范围 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 | 1000-01-01 ~ 9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | -838:59:59 ~ 838:59:59 | HH:MM:SS | 时间值 |
YEAR | 1 | 1901 ~ 2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 4 | 19700101080001~ 2038 年某时 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
- 用
now()
函数插入当前日期:insert into tablename values(now())
- 第一个 timestamp 会被系统自动创建默认值
current_timestamp
- timestamp 还有一个重要特点,就是和时区相关。当插入日期时,会先转换为本地时区后存放;而从数据库里面取出时,也同样需要将日期转换为本地时区后显示
字符串类型
类型 | 字节 | 用途 |
---|---|---|
CHAR(M) | M 为 0 - 255 | 固定长度的字符串 |
VARCHAR(M) | M 为 0 - 65535 | 可变长度的字符串 |
TINYBLOB | 0 - 255 | 不超过 255 个字符的二进制字符串 |
BLOB | 0 - 65535 | 二进制形式的长文本数据 |
MEDIUMBLOB | 0 - 167772150 | 二进制形式的中等长度文本数据 |
LONGBLOB | 0 - 4294967295 | 二进制形式的极大文本数据 |
TINYTEXT | 0 - 255 | 短文本字符串 |
TEXT | 0 - 65535 | 长文本数据 |
MEDIUMTEXT | 0 - 167772150 | 中等长度文本数据 |
LONGTEXT | 0 - 4294967295 | 极大文本数据 |
VARBINARY(M) | 0 - M | 可变的二进制字符串 |
BINARY(M) | 0 - M | 二进制字符串 |
ENUM | ||
SET |
-
在检索的时候,CHAR 删除了尾部的空格,而 VARCHAR 则保留这些空格
-
保存 BINARY 值时,在值的最后通过填充 “0x00”(零字节)以达到指定的字段定义长度
-
ENUM 中文名称叫枚举类型,它的值范围需要在创建表时通过枚举方式显式指定,对 1~255 个成员的枚举需要 1 个字节存储;对于 255~65535 个成员,需要 2 个字节存储。最多允许有 65535 个成员。忽略大小写。只允许从值集合中选取单个值,而不能一次取多个值
create table tn (n1 enum('A','B','C')); insert into tn values('a'),('B'),('C'),('D');// a 会被转换成 A,D 转换为空字符串
-
Set 和 ENUM 类型非常类似,也是一个字符串对象,里面可以包含 0~64 个成员。根据成员的不同,存储上也有所不同。Set 和 ENUM 除了存储之外,最主要的区别在于 Set 类型一次可以选取多个成员,而 ENUM 则只能选一个。区分大小写
1~8 成员的集合,占 1 个字节
9~16 成员的集合,占 2 个字节
17~24 成员的集合,占 3 个字节
25~32 成员的集合,占 4 个字节
33~64 成员的集合,占 8 个字节
create table tn (n1 set('A','B','C')); insert into tn values('A,B'),('A,C,A');// 重复成员的集合只取一次
网友评论