MySQL数据类型
目录
-
数值类型
- 整数
- 浮点数
- 定点数
- 位值
- 布尔值
-
时间/日期类型
- YEAR类型
- TIME类型
- DATE类型
- DATETIME类型
- TIMESTAMP类型
-
字符串类型
- CHAR类型和VACHAR类型
- BINARY类型和VARBINCHAR类型
- BLOB类型和TEXT类型
- ENUM类型
- SET类型
1.数值类型
1.1.整数
| 整数类型 | 字节数 |
|---|---|
| TINYINT | 1 |
| SMALLINT | 2 |
| MEDIUMINT | 3 |
| INT | 4 |
| INTEGER | 4 |
| BIGINT | 8 |
官方文档中的定义是这样的
INT[(M)] [UNSIGNED] [ZEROFILL]
我们就用这一个来举例:
其中(M)表示最大显示宽度,最大有效显示宽度的值是255,这个只用于数值显示时,对于宽度短于该列宽度的值左补全显示,并不是数字的最大的位数是M;UNSIGNED:和C语言中的unsigned一样表示无符号数,这个不经常用到,只是在存储IP时用到int unsigned时用到,因为IP地址一般形如127.0.0.1;最大为255.255.255.255,用int存储时存不下但是int unsigned是刚刚好能存下的;
补充
在MySQL中有把ip地址转换成int类型的函数;INET_ATON(127.0.0.1)负责把ip地址转化为数字;INET_NTOA()负责把数字转化为ip地址;
接下来演示一下:
接下来给大家讲解一条命令:show create table ip\G;
这条命令可以看到建立数据表的细节;
这里我们可以看到这张数据表的所有细节:ENGINE=InnoDB:所用的存储引擎是InnoDB;CHARSET=latin1:表示所用的字符集是latin1常见的字符集还有gbk,utf8;后两个是中文字符集,utf8一个字符等于三个字节,gbk一个字符等于两个字节;ZEROFILL:是在数字前填充0;具体的我们来演示一下;
但是这里a的长度还是1;
1.2.浮点数和定点数
我们直接来看官方文档对于浮点数和定点数的定义;
float[(M, D)] [UNSIGNED] [ZEROFILL]double[(M, D)] ...float(p) ...decimal[(M, D)] ...
float和double中的M和D表示精度和标度;M是数据的总长度(小数点不算位数),D表示小数点后位数;这里需要注意当这两个值确定了以后,整数部分也就确定了,整数部分的位数不能大于这个值,但是小数部分可以大于D但是会被截取,采取四舍五入法;float(p):p表示精度当0<=p<=24时MySQL把他当做float,当24<p<=53时被当做double; float(p)是很特殊的他只保留整数部分高位6位,剩下的部分四舍五入;
高精度类型 DECIMAL;
这个类型用来保存,必须为确切精度的值,如财务,足球赔率等;M最大为65,D最大为30;
这个就不做试验了,因为我觉得他和上面两个浮点数没有太大差别,主要就是M和D的值大了;
1.3.位值
BIT(M)类型表示允许存储M位数值,M的范围是1~64;占用的空间是(M+7)/8;如果BIT(M)列分配的值小于M则会在高位补充0;
我们在插入时可以直接插入十进制也可以插入二进制;但是注意插入十进制时不要超过了M;
这里我们会发现使用select *from t;我们什么也看不到,这是因为采用了位模式我们不能直接查看;
所以要用select bin(a) from t;
1.4.布尔值
我们来看个东西神奇;
其实在MySQL中布尔值存在数据库里就是tinyint一个整数类型;
2.时间日期类型
2.1.YEAR
year类型占用一个字节,定义时可以是year(2)或year(4);不过现在year(2)已经很少了,现在基本上就是year(4);year(4)的取值范围是1901~2155以及0000;
值得注意的是,在插入2000这个年份时需要用到:insert into t values('00');或insert into t values('0');;
例:
我们看到year类型默认为year(4);
2.2.TIME类型 DATETIME类型 DATE类型
因为date和time合起来就是datetime所以我们就直接说这个datetime;
datetime格式:YYYY-MM-DD HH:MM:SS占用8个字节;范围是:1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
这里值得注意的是,两个数字中间的符号可以是任何符号,也可以没有符号,具体的看示例;
需要注意的一点是,如果在年份写了两个数字他就会自动补全到最近的年份;
2.3.TIMESTAMP类型
TIMESTAMP类型和DATETIME类型的显示是一样的,不同的是TIMESTAMP类型占四个字节,范围为1970-01-01 00:00:01 ~ 2038-01-19 03:14:07;
主要这个类型要说的是和时区的关系;
当你检索一个值的时候,他会把按当前时区显示,我们来做一个小实验,这里我们创建一个timestamp和datetime作对比:
这里我们改一下我们的时区然后再改回来(我们改到伦敦):
我们从这个实验就能看到timestamp和datetime的区别;TIMESTAMP类型还有一个自动更新的属性:
3.字符串类型
3.1.CHAR类型和VARCHAR类型
char(M)这里的M最大为255表示字符数,而不是字节数,想utf8字符集一个字符等于三个字节,这里还是能放下255个字符占用255*3个字节;varchar(L)这里和char一样L表示字符数,他实际存储的字节数是字符串L长度+一个记录字符串长度的字节如果L小于255记录长度的字节是1,大于255记录字节长度的字节是2;
| 值 | CHAR(8) | 存储需求 | VARCHAR(8) | 存储需求 |
|---|---|---|---|---|
| ‘ab’ | ‘ab’ | 8 | ‘ab’ | 3 |
| ‘abc’ | ‘abc’ | 8 | ‘abc’ | 4 |
从这个表格就能看出来两者的区别了;
3.2.BINARY和VARBINARY
binary(M)和varbinary(M)这里与char和varchar最大的区别就是这里的M是字节数而不是字符数了;
目录后面几个先不写了,等后面遇到学了再写;