常见的数据类型
常见数据类型:
整型、浮点型、字符型、日期型、二进制型、bit类型
一、整型:
tinyint
smallint
mediumint
int / integer(常用)
bigint
注意:
- int(M)的默认值为int(11),zerofill默认为int(10)
- int(3)和int(11)只有用zerofill才有区别,当没有加zerofill时两者是没有任何区别的
- int(M)中的M表示的是显示宽度,与该数需要的储存空间大小和int字段能储存的数据上限没有关系
- 比如 int(1),用zerofill,如果你填的超过了1位数,按原样储存
CREATE TABLE t(X INT(1) ZEROFILL,Y INT(11) ZEROFILL);
INSERT INTO t(X,Y) VALUES(1,1);
INSERT INTO t(X,Y) VALUES(12,12);
SELECT X,Y FROM t;
当没有加zerofill时
CREATE TABLE c(X INT,Y INT(11));
INSERT INTO c(X,Y) VALUES(1,1);
INSERT INTO c(X,Y) VALUES(12,12);
SELECT X,Y FROM c;
zerofill默认为int(10)
CREATE TABLE e(X INT ZEROFILL);
INSERT INTO e(X) VALUES(1);
INSERT INTO e(X) VALUES(12);
SELECT X FROM e;
二、浮点型:
double(m,n):双精度
float(m,n):单精度
decimal(m,n):精度最高,在表示钱方面使用该类型,因为不会出现精度缺失问题
m和n可选
浮点型中(m,n)指,最多m位,其中小数点后必须有n位
比如:double(5,2)表示最多5位,其中小数点后必须有2位,即最大值为999.99
float 和 double 区别:
最本质区别:
float 在计算机中用4个字节来储存
double 在计算机中用8个字节来储存
1. 占用内存不同:
float 使用4个字节(32位)存储空间来存储一个浮点数,包括符号位1位,指数位8位,尾数位23位。
double 使用 8个字节(64位)存储空间来存储一个浮点数,包括符号位1位,指数位11位,尾数位52位。
2. 所存的数值范围不同
float 数值范围为-3.4E38~3.4E38
double 数值范围为-2.23E308 ~ 1.79E308
E表示10的多少次方,如3.4E38指的是3.4乘以10的38次方
3. 十进制下的位数不同
单精度浮点数最多有7位十进制有效数字,如果某个数的有效数字位数超过7位,当把它定义为单精度变量时,超出的部分会自动四舍五入。
双精度浮点数可以表示十进制的15或16位有效数字,超出的部分也会自动四舍五入。
三、字符型:
char(n):n可选
,固定长度字符串类型:char长度可选范围是0-255 字符
固定长度是指,比如char(10),可以存入10个字符,但只存入了2个字符,其它会被自动用空格填满
查询时,返回的数据尾部没有空格
比如 char(即 char(1) ),如果所存入的字符数大于1,将只显示第一个字符
CREATE TABLE f(X CHAR);
INSERT INTO f(X) VALUES('哈哈哈哈哈哈哈');
SELECT X FROM f;
varchar(n):·n不可选·,可变长度字符串类型
可变长度是指,比如varchar(10),可以存入10个字符,但是只存了2个字符,不会自动填满
5.0.3 以下的版本中的最大长度限制为 255 字符
5.0.3 及以上的版本中最大长度限制为 65535 字节,起始位和结束位占去了3个字节
比如 varchar(1) ,如果所存入的字符数大于1,将只显示第一个字符
text:常用于存储较长文本
不可以有默认值,其最大长度是 2 的 16 次方 -1
字符型(n)中的n指字符数
UTF8:1 汉字=3 字节
GBK:1 汉字=2 字节
四、日期型
date:格式为 yyyy-MM-dd,只显示 年月日
time:格式为 hh:mm:ss,只显示 小时分钟秒
timestamp:时间戳类型,显示 日期+时间,格式为yyyyMMdd hhmmss
datetime:显示日期+时间,格式为yyyy-MM-dd hh:mm:ss
MySQL5.6.5之后的版本,在默认的秒精确度上,可以带小数,最多可以带6位,即可以精确到 microseconds (6 digits) precision
timestamp和datetime区别
1)时间范围不同
timestamp的时间范围比datetime小很多
2)储存方式不同
timestamp将客户端插入的时间从当前时区转化为UTC(世界标准时间)进行存储。查询时,又将其转化为客户端当前时区进行返回
datetime不做任何改变,原样输入和输出
timestamp在新旧版本上的区别
新版本
TIMESTAMP 在mysql 5.6.5之后,TIMESTAMP(fraction)中的fraction代表的是小数位数,最大为6
旧版本
TIMESTAMP(fraction)中fraction值显示尺寸的格式
在创建表时,可以指定任意尺寸,但如果定义列长为0或者比14大均会被强制定义为列长14
时间戳和日期格式的相互转换
- 时间日期格式转换成时间戳格式:UNIX_TIMESTAMP()
SELECT UNIX_TIMESTAMP(NOW()); //1598620548
- 时间戳格式转换成时间日期格式:FROM_UNIXTIME()
SELECT FROM_UNIXTIME(1598620548); //2020-8-28 21:15:48
五、二进制型
blob(常用)
tinyblob
mediumblob
longblob
作用:存储图片数据
六、bit类型
- bit[(M)]:位字段类型,M表示每个值的位数,范围1~64,默认为1。
- bit(1) 是一个二进制位,值只有 0 和 1 ,直接对应java语言中boolean类型的 false 和 true
- bit(M)多用于储存状态,一个字段可以保存多至64个状态
- 如果手动指定bit值,则可以使用b’value’格式,比如b’111’和 b’10000000’分别代表7和128
- 查询bit类型 在表中定义bit类型
- 查询出来是b’value’格式
sql SELECT ORD(whether_is_borrowed) FROM books;
常见的约束
说明:
用于限制表中字段的数据的,从而进一步保证数据表的数据是一致的、准确的、可靠的!
六大常见约束:
1. NOT NULL 非空约束:用于限制该字段为必填项
2. DEFAULT 默认约束:用于限制该字段如果没有显示插入值,则直接显示默认值
3. PRIMARY KEY 主键约束:用于限制该字段值不能重复,设置为主键列的字段默认不能为空
- 一个表只能有一个主键,当然也可以是组合主键
- 组合主键:一个表中假如有3列都被设置为主键,则这3列为组合主键,即只有3列字段完全相同才算重复,才会报错
4. UNIQUE 唯一约束:用于限制该字段值不能重复
比较:
字段是否可以为空 一个表可以设定几个
主键约束 不可以 1个
唯一约束 可以 n个
5. CHECK 检查约束(mysql不支持):用于限制该字段值必须满足指定条件
语法:CHECK(字段名 BETWEEN 条件1 AND 条件2)
6. FOREIGN KEY 外键约束:用于限制两个表的关系,要求外键列的值必须来自于主表的关联列
要求:
- 主表的关联列和从表的关联列的类型必须一致,意思必须一样,名称无要求
- 主表的关联列要求必须是主键
- 外键约束语法:
constraint [名称_从表名_主表名] foreign key 从表关联列 references 主表关联列
- 如果添加外键约束,数据类型后面加’,’,并且另起一行
案例:添加约束
CREATE TABLE IF NOT EXISTS stuinfo(
stuid INT PRIMARY KEY,#添加了主键约束
stuname VARCHAR(20) UNIQUE NOT NULL,#添加了唯一约束+非空约束
stugender CHAR DEFAULT '男',#添加了默认约束
email VARCHAR(20) NOT NULL,#非空约束
age INT CHECK(age BETWEEN 1 AND 100),#检查约束,不起作用,mysql中不支持
majorid INT,
CONSTRAINT fk_stuinfo_major FOREIGN KEY (majorid) REFERENCES magor(id)#添加了外键约束
#外键约束语法:constraint [名称_从表名_主表名] foreign key 从表关联列 references 主表关联列
#如果添加外键约束,数据类型后面加',',并且另起一行
)