每次设计表结构都在纠结用什么类型!
今天统一整理下,深度认识下各个类型!
1.整型
数据类型 | 字节数 | 带符号最小值 | 带符号最大值 | 不带符号最小值 | 不带符号最大值 |
TINYINT | 1 | -128 | 127 | 0 | 255 |
SMALLINT | 2 | -32768 | 32767 | 0 | 65535 |
MEDIUMINT | 3 | -8388608 | 8388607 | 0 | 16777215 |
INT | 4 | -2147483648 | 2147483647 | 0 | 4294967295 |
BIGINT | 8 | -9223372036854775808 | 9223372036854775807 | 0 | 18446744073709551616 |
需要注意的点:
在设置数据库类型的时候 例如int(11) 后面的数字用处是显示几位,无论写几都是占用相同的4字节(不要想着数字小占用的存储就小)。不过,当你的数据位数大于设置时的数字,那么全部显示出来忽略您设置的数字。所以这个东西唯一 的用处就是当你想要存储001这样的数字,设置int(3) unsigned zerofill 记住后面的zerofill的才是补0的命令。还有最后一个当时比较迷惑我的。为什么普遍设置int(11),明明最多是10位为什么要设置11位,因为还有一个符号位负号。(记住这个负号,接下来还有)
整型总结:只要你想存整型的数据,尽管设置int(11)。当然要注意值的范围。
2.小数
这里说小数,主要是以为具有两种表示小数的类型
一种是 float 和 double 浮点数 一种是decimal和numeric 定点数
首先说明,如果你想把浮点数的东西弄明白,首先你得先明白它是如何存储的,但是这个知识篇幅过大,在这里只介绍如何用,用的时候的注意点
先说float和double
float(M,D) double(M,D)
M总显示位数D小数点后面显示的位数,当位数过多四舍五入。
再说decimal和numeric
这两个东西是一个东西,存储方式和使用都是一样的所以只介绍一个就可以了
注意点一:这个东西如果后面不够位数,例如类型为(5,5) 如果存入的是12345.12 那么在数据库中会显示为12345.12000,在 一些工具上是不显示的 要注意。
注意点二:当小数给的位数过多会怎么样,例如类型为(5,5)存入的是12345.12345678 那么数据库会直接截取五位,12345.12345
注意点三:当整数位给的过多怎么办,例如(5,5) 存入的是123456.12345 那么数据库直接获取整数五位小数五位的最大值,99999.99999,当小数和整数均 超过,那么直接按整数超过算
注意点四:最为重要,在存储小数的时候,用定点数存储,不要用float存。一旦float类型的列sum就发生精度不对的问题。往往会出现好多位的小数。不要问为什么,去看计算机组成原理。记住小数就用定点数。人家oracle都没有浮点数,想想为什么?
还有一点 ,当不给(M,D)的情况下是怎么存储的
float和double直接按照实际精度存储,那么什么是实际精度呢就是按照它自己的存储方式和 占用字节进行精度和范围的取舍,所以呢这块也得看计算机组成原理。回想下,是不是学这个的时候都在逃课啊。
decimal和numeric按照(10,0)存储
3.日期类型
数据类型 | 字节数 | 格式 | 备注 |
date | 3 | yyyy-MM-dd | 存储日期值 |
time | 3 | HH:mm:ss | 存储时分秒 |
year | 1 | yyyy | 存储年 |
datetime | 8 | yyyy-MM-dd HH:mm:ss | 存储日期+时间 |
timestamp | 4 | yyyy-MM-dd HH:mm:ss | 存储日期+时间,可作时间戳 |
前三个就不说了,正常存储。
说说第四个和第五个的区别:
占用字节不同,那么范围肯定不同了
datetime 1000-01-01 00:00:00 —— 9999-12-31 23:59:59
timestamp 1970-01-01 08:00:01 —— 2038-01-19 11:14:07
timestamp的方便之处
create_time timestamp default current_timestamp comment "创建时间",
update_time timestamp default current_timestamp on update current_timestamp comment "修改时间",
明白了吗?自动的创建时间和修改时间。不过是5.6之后有的注意哈。
4.字符(char,varchar)
通过读这一小节,你可能会发现原来自己明白的是那么的少。(至少我是哈,至于你们相信你们都是大牛。嘿嘿)
首先说一点比较简单的区别:
char类型会把字符串末尾所有的空格都删掉不存储,记住至少结尾的空格,而varchar会一股脑的都存储起来。
下面说说占用空间的问题:
char:
0-255字符 例:char(255) 这个是固定的 无论何种编码格式最大字符就是255 (是255个字)
verchar:
这个就比较麻烦了。
首先你要明白,一行数据的总存储量最大是65K,所以某一个varchar字段的最大数量并不是固定的。
先看看varchar是怎么占用空间的,首先要拿出1-2个字节存这个字段varchar的字符数量 255是1和2的分界线。应该名表吧(不明白的去看计算机组成原理)还要拿出一个字节表示是否为null(一般都要设置成非null,明白为什么了吧)
剩下的就是给字符了 utf-8 是三个字节 urfmb4 是四个字节 gbk两个字节
剩下的就自己算吧
在看看text、blob、mediumtext、longtext
这些东西我记得都不是存在这行数据中,而是存一个路径,然后再去找。所以能这些尽量不要存
tinytext 256B
text 64kB
mediumtext 16MB
longtext 4GB
结束了,可能并不是很深入和明白。见谅!
有几点设计数据库字段类型的建议:
不确定的能用varchar就不要用text等大的字符串变量
能确定长度的就用char,存储很快滴
能用数字的就不要用字符类型(这个么主要是数字好比较)