数据类型是什么?说白了就是数据的存储格式、约束和有效范围。
数据类型的选取,也就是指定不同数据的底层数据存储结构,直接地影响到数据库的性能。
数据类型的选取也是数据库性能调优的一个重要的点,用心学习数据类型也是为日后学习数据库调优做准备。
开始学习如何捕鱼……
我怎么知道数据库有哪几种数据类型呢?
我在这篇文章讲过怎么快速查阅MySQL帮助:当我忘记SQL怎么写的时候,我……
查看数据类型有哪些
每种数据类型的具体语法和使用说明
可以看到数据类型:int 的具体语法和使用说明(主要是有效范围)
这里列出的所有数据类型都可以通过这种方式来查看具体语法和说明,所以不需要特意去记忆这些数据类型的具体细节,记了也会忘掉,学会怎么查阅比这更有意义。
接下来讲解常用的几种数据类型。
1.数值类型
1个字节=8位二进制,8位=2^8=256,所以1个字节总长度=256
1111 1111=255,所以1个字节最大存储的值为255
其中“0000 0000”=0也是一个值,1+255=256=2^8
所以要知道1个字节总长度和存储最大值不是同一个概念!!!总长度=最大值+1
无符号最大值计算公式:n字节=(2^n*8)-1
整型和点数类型都可以加上约束:[UNSIGNED] [ZEROFILL] 分别是“无符号”和“补零”。
整型和点数类型语法:基础语法 [UNSIGNED] [ZEROFILL] UNSIGNED 只能存非负数 ZEROFILL 自动在存储的值前面补充零来填满剩余位数,并且自动添加UNSIGNED 属性
1.1整型类型例子
怎么选择?主要看有效范围是否符合业务要求
-- int 类型,无符号,不为空,自动递增 CREATE TABLE animals ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, name CHAR(30) NOT NULL, PRIMARY KEY (id) );
-- 插入多条数据,不需要给id 赋值 INSERT INTO animals (name) VALUES ('dog'),('cat'),('penguin'),('lax'),('whale'),('ostrich');
对于一般的自动递增,int unsigned 可以存储42亿多条数据,已经足够使用了,不需要使用bigint类型。使用bigint类型意味着,每条数据的主键都需要多使用一倍多的空间和更多的计算资源。
1.2点数类型例子
create table t1( id1 float(9,2), id2 double(9,2), id3 decimal(9,2));
可见语法都是相同的
insert into t1 values('1.2','1.24','1.235');
会自动补充小数点位数、超出小数点位数则四舍五入
其中DECIMAL列的所有基本计算(+、-、*、/)都以65位数字的精度完成。对于存储金额类型,务必使用decimal类型来存储。DECIMAL最大范围为:DECIMAL(65,30)。
2.字符类型
char的特点:
-
保存固定长度M
-
保存的值大于M会被截掉,小于会用空格进行填补
-
最大字符长度255
varchar的特点:
-
只存储字符串实际需要长度
-
使用额外1~2字节来存储值的长度(0~255使用1字节,否则2字节)
-
最大字符长度65535
重点说明
-
char 和 varchar 的长度都是指“字符长度”,而不是字节长度,不同编码所需的字节长度不同
-
latin1 占用1个字节,gbk 占用2个字节,utf8 占用3个字节,utf8mb4 占用4个字节
-
当使用gbk编码时,char最大字符长度为255;varchar最大字符长度32766
-
当使用utf8编码时,char最大字符长度为255;varchar最大字符长度21844
-
当使用utf8编码时,char最大字符长度为255;varchar最大字符长度16383
例子:
如:char(3),固定存储三个字符,不同编码固定所需字节数:latin1需要3个字节,gbk需要6个字节,utf8需要9个字节。
如:varchar(3),最大存储三个字符,不同编码最大所需字节数:latin1需要4个字节,gbk需要7个字节,utf8需要10个字节。
如:varchar(256),最大存储256个字符,不同编码最大所需字节数:latin1需要258个字节,gbk需要514个字节,utf8需要770个字节。
--语法 CHAR[(M)] [CHARACTER SET charset_name] [COLLATE collation_name] VARCHAR(M) [CHARACTER SET charset_name] [COLLATE collation_name] --也可以写成 CHAR[(M)] [CHARSET charset_name] [COLLATE collation_name] VARCHAR(M) [CHARSET charset_name] [COLLATE collation_name]
怎么选择char和varchar
固定长度选char,不受编码影响。如:uuid字符串,md3字符串;
经常变化长度的选varchar。如:家庭地址,个人简介。
3.时间类型
3.1 timestamp 和 datetime
时间类型具体格式见表中例子,其中timestamp 和 datetime都可以精确到秒
例子
timestamp 默认会自动更新为当前时间,datetime默认为空null,但可以在见表时指定默认值,使两者相同默认值。
-- CURRENT_TIMESTAMP 插入默认当前时间 -- on update CURRENT_TIMESTAMP 更新时默认当前时间 create table time2( id int, ts timestamp, dt datetime default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP );
timestamp和datetime 区别
-
所需字节数不同,timestamp 4个字节,datetime 8个字节
-
有效范围不同,timestamp 最大2038年,datetime 9999年
MySQL中如何表示当前时间?
除了上面说的默认值CURRENT_TIMESTAMP
还有以下几种
-
CURRENT_TIMESTAMP()
-
NOW()
-
LOCALTIME
-
LOCALTIME()
-
LOCALTIMESTAMP
-
LOCALTIMESTAMP()
哪个简单记哪个,记得函数now() 就好了,其他混个眼熟。
3.2 date 和 time
没啥好讲的,记得数据格式即可,具体看前面的表格
看个例子
3.3 year
年固定4位,看例子吧
create table year1 ( id int,y year );insert into year1 (id,y) values (1,now()),(2,2022-12-30),(3,2022),(4,22);
关注公众号获取免费PDF电子书和阅读更多相关文章