MySQL 5.7常见数据类型
——《深入浅出MySQL(第二版)》笔记
数值类型
整数类型 | 字节 | 最小值 | 最大值 |
---|---|---|---|
TINYINT | 1 | 有符号 -128;无符号 0 | 有符号 127;无符号 255 |
SMALLINT | 2 | 有符号 -2^16;无符号 0 | 有符号 2^16-1;无符号 2^17-1 |
MEDIUMINT | 3 | 有符号 -2^24;无符号 0 | 有符号 2^24-1;无符号 2^25-1 |
INT\INTEGER | 4 | 有符号 -2^32;无符号 0 | 有符号 2^32-1;无符号 2^33-1 |
BIGINT | 8 | 有符号 -2^64;无符号 0 | 有符号 2^64-1;无符号 2^65-1 |
浮点类型 | 字节 | 最大值 | 最小值 |
---|---|---|---|
FLOAT | 4 | ||
DOUBLE | 8 |
定点数类型 | 字节 | 描述 |
---|---|---|
DEC(M,D)\DECIMAL(M,D) | M+2 | 最大值取值范围与DOUBLE相同,给定DECIMAL的有效取值范围由M和D决定 |
位类型 | 字节 | 最小值 | 最大值 |
---|---|---|---|
BIT(M) | 1~8 | BIT(1) | BIT(8) |
整数类型
对于整数类型,MySQL支持在类型名称后面使用(n)
的方式指定显示宽度,例如int(5)
表示当数值宽度小于5位时,在数字前面填满宽度,如果不显示指定宽度则默认为int(11)
。一般配合zerofill使用,就是用'0'填充。
示例:
--创建表t1,有id1和id2两个字段,指定数值宽度分别为int和int(5) mysql> create table t1 (id1 int,id2 int(5)); mysql> desc t1;
--在id1和id2中都插入数值1 mysql> insert into t1 values (1,1); mysql> select * from t1;
--分别给id1和id2字段增加zerofill参数 mysql> alter table t1 modify id1 int zerofill; mysql> alter table t1 modify id2 int(5) zerofill;
设置了宽度限制后,如果插入大于宽度限制的值,不会对插入的数据有任何影响,还是按照类型的书记精度进行保存。这时,宽度格式实际已经没有意义,左边不会再填充任何的“0”字符。
--向表t1的id1中插入1,id2中插入12345678 mysql> insert into t1 values(1,12345678); mysql> select * from t1;
所有的整数类型都有一个可选属性UNSIGNED
(无符号),如果需要在字段里面保存非负数或者需要较大的上限值,可以用此选项。而当一个列指定为zerofill,则MySQL自动为该列添加UNSIGNED属性。
另外,整数类型还有一个独有的AUTO_INCREMENT
属性,表示该列的值是自增型。AUTO_INCREMENT值一般从1开始,每行增加1。在插入NULL到一个AUTO_INCREMENT列时,MySQL插入一个比该列当前最大值大1的值。一个表中最多只能有一个列是AUTO_INCREMENT的。
对于任何想要使用AUTO_INCREMENT的列,应该定义为NOT NULL,并定义为UNIQUE。
浮点类型
对于小数的表示,MySQL分为浮点数和定点数两种。浮点数包括float(单精度)和double(双精度),而定点数只有decimal一种。定点数在MySQL内部以字符串形式存放,比浮点数更精确,适合用来表示货币等精度高的数据。
浮点数和定点数都可以用类型名称后加"(M,D)"的方式来进行表示,"(M,D)"表示该值一共显示M位,小数有D位。MySQL保存浮点值时对超出位采用的是四舍五入的方式。因此如果在float(5,3)中插入123.006,则保存的值为123.01。float和double在不指定精度时,默认按照实际硬件和操作系统来决定;而decimal不指定时,默认整数位为10,小数位为0。
示例:
--创建表tf,分别将id1,id2,id3字段设置为float(5,2),double(5,2),decimal(5,2) mysql> create table tf( id1 float(5,2),id2 double(5,2),id3 decimal(5,2));
--向表中三个字段分别插入数据1.23 mysql> insert into tf values(1.23,1.23,1.23);
--向表中分别插入数据1234.005 mysql> insert into tf values(1234.005,1234.005,1234.005);
--向表中分别插入数据123.005 mysql> insert into tf values(123.005,123.005,123.005);
--向表中分别插入数据123.006,123.006,123.004 mysql> insert into tf values(123.006,123.006,123.004);
--去掉表tf字段的精度,并重新插入1.23 mysql> alter table tf modify id1 float; mysql> alter table tf modify id2 double; mysql> alter table tf modify id3 decimal; mysql> insert into tf values(1.23,1.23,1.23); mysql> desc tf;
--向表中分别插入1.234567123321,1.234567123321123321,1.23234233 mysql> insert into tf values(1.234567123321,1.234567123321123321,1.23234233);
位类型
对于BIT类型,用于存放位字段值,BIT(M)可以用来存放多位二进制数,M范围从1~64,如果不写,默认为1位。而直接使用SELECT命令不会看到查询结果,需使用bin()
(显示为二进制)函数或者hex()
(显示为16进制)函数进行读取。
示例:
--创建表tb,定义字段id1为bit(1),id2字段为bit mysql> create table tb(id1 bit(1),id2 bit);
--向tb中插入1,1 mysql> insert into tb values(1,1); mysql> select * from tb; mysql> select bin(id1),hex(id2) from tb;
数据插入bit两类型字段时,首先转换为二进制,如果位数允许,则成功插入;如果位数超出定义的位数,则插入失败。
时间类型
MySQL中由多种数据类型可以用于日期和时间的表示,下表是MySQL5.0中所有支持的日期和时间类型。
日期和时间类型 | 字节 | 最小值 | 最大值 |
---|---|---|---|
DATE | 4 | 1000-01-01 | 9999-12-31 |
DATETIME | 8 | 1000-01-01 00:00:00 | 9999-12-31 23:59:59 |
TIMESTAMP | 4 | 19700101080001 | 2038年某个时刻 |
TIME | 3 | -838:59:59 | 838:59:59 |
YEAR | 1 | 1901 | 2155 |
每种时间类型都有一个有效范围,如果超出这个范围,在默认的SQLMode下,系统会进行错误提示,并将以零值来进行存储。
数据类型
--创建表tdt mysql> create table tdt(dt date, dttm datetime, tms timestamp,tm time,yr year);
--使用now()函数向表中插入当前时间 mysql> insert into tdt values(now(),now(),now(),now(),now() );
--向tms中插入NULL,MySQL会自动赋值系统时间 mysql> insert into tdt(tms) values(null);
MySQL只会给表中第一个TIMESTAMP字段赋值系统时间,如果有其他的,则赋值为0值。
--修改表tdt,增加TIMESTAMP类型的tms1列,并给tms,tms1赋值null mysql> alter table tdt add tms1 timestamp; mysql> desc tdt; mysql> insert into tdt(tms,tms1) values(null,null);
TIMESTAMP有一个重要特点,就是和失去相关。当插入提起时,会先转换为本地时区后存放;而从数据库取出时,需要将日期转换为本地时区后显示。
--创建表tdt1,包含字段tms,dt mysql> create table tdt1(tms timestamp,dt datetime);
--查看当前时区,并向表tdt1中插入系统时间 mysql> show variables like 'time_zone'; mysql> insert into tdt1 values(now(),now());
可以发现,时区的值为SYSTEM
,这个值默认是和主机的时区一致的,因为处在中国,这里实际是东八区(+8:00)。
--修改时区为东九区,再次查看tdt1中的时间 mysql> set time_zone='+9:00';
字符串类型
MySQL中提供了多种对字符串数据的存储类型,不同版本有所差异。以5.0为例,MySQL包括了CHAR
、VARCHAR
、BINARY
、VARBINARY
、BLOB
、TEXT
、ENUM
和SET
等多种。
数据类型 | 描述即存储 |
---|---|
CHAR(M) | M为0~255之间的整数 |
VARCHAR(M) | M为0~65535之间的整数,值的长度+1个字节 |
TINYBLOB | 允许长度0~255字节,值的长度+1个字节 |
BLOB | 允许长度0~65535字节,值的长度+2个字节 |
MEDIUMBLOB | 允许长度0~167772150字节,值的长度+3个字节 |
LONGBLOB | 允许长度0~4294967295字节,值的长度+4个字节 |
TINYTEXT | 允许长度0~255字节,值的长度+1个字节 |
TEXT | 允许长度0~65535字节,值的长度+2个字节 |
MEDIUMTEXT | 允许长度0~167772150字节,值的长度+3个字节 |
LONGTEXT | 允许长度0~4294967295字节,值的长度+4个字节 |
VARBINARY(M) | 允许长度0~M个字节的变长字节字符串,值的长度+1个字节 |
BINARY(M) | 允许长度0~M个字节的定长字节字符串 |
方法
CHAR和VARCHAR
两者很类似,都用来保存MySQL中较短的字符串。二者主要区别在于存储方式的不同:CHAR列的长度固定为创建表时声明的长度;而VARCHAR列中的值为可变长字符串。在检索时,CHAR会删除尾部的空格,而VARCHAR不会。
--创建表tc,包含两个字段ch(char(6))和vc(varchar(6)) mysql> create table tc (ch char(6),vc varchar(6)); --向ch和vc字段插入'abc ' mysql> insert into tc values('abc ','abc '); --查询字段长度 mysql> select length(ch),length(vc) from tc;
BINARY和VARBINARY
类似于CHAR和VARCHAR,不同的是它们存储的是二进制的字符串。
--创建表tbc,包含字段bc(binary(6))、vbc(varbinary(6)) mysql> create table tbc (bc binary(6),vbc varbinary(6)); --向表中插入数据('a ','a ') mysql> insert into tbc values('a ','a '); --查看字段值长度 mysql> select length(bc),length(vbc) from tbc;
当保存BINARY值时,MySQL通过在值的最后填充0x00
(零字节)以达到指定的字段定义长度。
--通过hex()函数查看tbc中数据的保存 mysql> select length(bc),length(vbc) from tbc;
ENUM类型
枚举类型,它的值范围需要在创建表时通过枚举方式显示指定,对1255个成员的枚举,需要1个字节存储;对于25665535个成员,需要2个字节存储。最多允许有65535个成员。
--创建表te,包含字段f1(enum('a','b','c')) mysql> create table te(f1 enum('a','b','c')); --向表中插入几条记录 mysql> insert into te values('a'),('B'),('3'),(null);
ENUM是忽略大小写的。还支持使用下标(从1开始,下标越界时报错)的方式插入数据。特殊值'0'
表示一个空值。
SET类型
SET和ENUM非常类似,也是一个字符串对象,里面可以包含0~64个成员。根据成员个数不同,存储也有所不同。
1~8个成员的集合,占1个字节
9~16个成员的集合,占2个字节
17~24个成员的集合,占3个字节
25~32个成员的集合,占4个字节
32~64个成员的集合,占8个字节
而且,SET类型一次可以选择多个成员。
--创建表ts,包含字段f1(set()) mysql> create table ts (f1 set('a','b','c','d')); mysql> insert into ts values('a,b'),('a,d'),('b,c,d');
--向表中插入数据('a,b,a,c,d,d') mysql> insert into ts values('a,b,a,c,d,d');
SET类型可以从允许值集合中选择任意个元素进行组合,所以对于输入的值只要在允许值的组合范围内,都可以正确的记录到SET类型的列中。对于超出允许范围的值,报错。而有重复成员的集合,将自动去重。
到此这篇关于MySQL 5.7常见数据类型的文章就介绍到这了,更多相关MySQL数据类型内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!
相关文章
- 这篇文章主要介绍了MySQL性能监控软件Nagios的安装及配置教程,这里以CentOS操作系统为环境进行演示,需要的朋友可以参考下...2015-12-14
php中浮点型(float)和整型(integer)数据类型详解
文章分析了关于php中浮点型(float)和整型(integer)数据类型的用法区别以及在那种情况下会出现数据长度不够。 取值只能为True或者False,当其他类型转化为boolean类...2016-11-25- 新版 Mysql 中加入了对 JSON Document 的支持,可以创建 JSON 类型的字段,并有一套函数支持对JSON的查询、修改等操作,下面就实际体验一下...2016-08-23
- 本篇文章主要是对c#中数据类型占用的字节数进行了详细的介绍。需要的朋友可以过来参考下,希望对大家有所帮助...2020-06-25
深入研究mysql中的varchar和limit(容易被忽略的知识)
为什么标题要起这个名字呢?commen sence指的是那些大家都应该知道的事情,但往往大家又会会略这些东西,或者对这些东西一知半解,今天我总结下自己在mysql中遇到的一些commen sense类型的问题。 ...2015-03-15- 这篇文章主要介绍了MySQL 字符串拆分操作(含分隔符的字符串截取),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-22
- 一、先说一下为什么要分表:当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,有可能会死在那儿了。分表的目的就在于此,减小数据库的负担,缩短查询时间。根据个人经验,mysql执行一个sql的过程如下:1...2014-05-31
- 我们自己鼓捣mysql时,总免不了会遇到这个问题:插入中文字符出现乱码,虽然这是运维先给配好的环境,但是在自己机子上玩的时候咧,总得知道个一二吧,不然以后如何优雅的吹牛B。...2015-03-15
- 这几天在centos下装mysql,这里记录一下安装的过程,方便以后查阅Mysql5.5.37安装需要cmake,5.6版本开始都需要cmake来编译,5.5以后的版本应该也要装这个。安装cmake复制代码 代码如下: [root@local ~]# wget http://www.cm...2015-03-15
- 虽然Javascript是弱类型语言,但是,它也有自己的几种数据类型,分别是:Number、String、Boolean、Object、Udefined、Null。其中,Object属于复杂数据类型,Object 由无序的键值对组成。其余几种都属于简单数据类型。注意:变量...2015-10-21
- 宿主机使用网线的时候,客户机在Bridged Adapter模式下,使用Atheros AR8131 PCI-E Gigabit Ethernet Controller上网没问题。 宿主机使用无线的时候,客户机在Bridged Adapter模式下,使用可选项里唯一一个WIFI选项,Microsoft Virtual Wifi Miniport Adapter也无法上网,故弃之。...2013-09-19
- 首先要声明一点,大部分情况下,修改MySQL密码是需要有mysql里的root权限的...2013-09-11
- MySQL命令行导出数据库: 1,进入MySQL目录下的bin文件夹:cd MySQL中到bin文件夹的目录 如我输入的命令行:cd C:/Program Files/MySQL/MySQL Server 4.1/bin (或者直接将windows的环境变量path中添加该目录) ...2013-09-26
- 这篇文章主要为大家详细介绍了JavaScript实现数据类型的相互转换,感兴趣的朋友可以参考一下...2016-03-09
- 一、连接Mysql格式: mysql -h主机地址 -u用户名 -p用户密码1、连接到本机上的MYSQL。首先打开DOS窗口,然后进入目录mysql/bin,再键入命令mysql -u root -p,回车后提示你输密码.注意用户名前可以有空格也可以没有空格,但是密...2015-11-08
- 本文主要介绍了C#的四种基本数据类型的相关知识,具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
- Navicat for MySQL注册码用来激活 Navicat for MySQL 软件,只要拥有 Navicat 注册码就能激活相应的 Navicat 产品。这篇文章主要介绍了Navicat for MySQL 11注册码\激活码汇总,需要的朋友可以参考下...2020-11-23
- 这篇文章主要介绍了mysql IS NULL使用索引案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...2021-08-14
- 这篇文章主要介绍了基于PostgreSQL和mysql数据类型对比兼容,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-25
- 一、准备编译环境,安装所需依赖包yum groupinstall 'Development' -y yum install openssl openssl-devel zlib zlib-devel -y yum install readline-devel pcre-devel ncurses-devel bison-devel cmake -y二、编译安...2015-10-21