类型1:串数据
串数据类型很常用。它们存储串,如名字、地址、电话号码、邮政编码等。有两种基本的串类型,分别为定长串和变长串。
串数据类型 | 说明 |
char | 1~255个字符的定长串。长度必须在创建时指定,否则默认为1。 若指定长度为10,输入"abc"时,其后边7个字符全都是空格。总占用存储长度仍为10。 |
enum | 接受最多64K个串组成的一个预定义集合的某个串 |
text | 最大长度为64K的变长文本(2^16-1) |
tinytext | 与TEXT相同,但最大长度为255字节(2^8-1) |
mediumtext | 与TEXT相同,但最大长度为16M(2^24-1) |
longtext | 与TEXT相同,但最大长度为4GB(2^32-1) |
set | 接受最多64个串组成的一个预定义集合的零个或多个串 |
varchar | 长度可变,长度必须指定。Mysql5.0.3之后,最大长度为65535,5.0.3之前为255。 如果在创建时指定为VARCHAR(n),则可存储0到n个字符的变长串。 若指定长度为10,输入"abc"时,总占用存储长度为3。 |
char和varchar对比
项 | char | varchar |
读写速度 | char要比varchar快 | |
空间占用 | varchar比char占用少 | |
长度 | 最大255字符 | 最大65535字符 |
格式
- 使用引号 : 不管使用何种形式的串数据类型,串值都必须括在引号内(通常单引号更好)。
- 当数值不是数值时: 你可能会认为电话号码和邮政编码应该存储在数值字段中(数值字段只存储数值数据),但是,这样做却是不可取的。如果在数值字段中存储邮政编码01234,则保存的将是数值1234,实际上丢失了一位数字。需要遵守的基本规则是:如果数值是计算(求和、平均等)中使用的数值,则应该存储在数值数据类型列中。 如果作为字符串(可能只包含数字)使用,则应该保存在串数据类型列中。
类型2:数值数据
数值数据类型存储数值。 MySQL支持多种数值数据类型,每种存储的数值具有不同的取值范围。显然,支持的取值范围越大,所需存储空间越多。此外,有的数值数据类型支持使用十进制小数点(和小数),而有的则只支持整数。
数值数据类型 | 说明 |
boolean(或bool) | 布尔标志,值为0/1。是TINYINT(1)的同义词。 |
bit | 位字段,1~64位。(在MySQL5之前,BIT在功能上等价于TINYINT)。默认为1位 |
int(或integer) | 整数值,支持 -2^31~2^31-1(如果是UNSIGNED,为0~2^32)的数。默认长度为11 |
tinyint | 整数值,支持 -2^7(128)~2^7-1(127)(如果为UNSIGNED,为0~2^8-1(255))的数。默认长度为4. 可与Java的Boolean/boolean类型对应(1对应TRUE/true,0对应FALSE/false)。此时,一般将tinyint长度指定为1。 |
smallint | 整数值,支持 -2^15~2^15-1(如果是UNSIGNED,为0~2^16-1(65535))的数。默认长度为6 |
mediumint | 整数值,支持 -2^23~2^23-1(如果是UNSIGNED,为0~2^24-1)的数。默认长度为9 |
bigint | 整数值,支持 -2^63~2^63(如果是UNSIGNED,为0~2^64)的数。默认长度为20 |
decimal(或dec) | 精度可变的浮点值。定点类型在数据库中存放的是精确值。 decimal(m,d) //m<65 :总位数 d<30且 d<m :小数位。 |
double | 双精度浮点值。用法:double(m,n) //m:总位数 n:小数位数 (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) //有符号范围 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) //无符号范围 |
float | 单精度浮点值。 (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) //有符号范围 0,(1.175 494 351 E-38,3.402 823 466 E+38) //无符号范围 float(5,3):若插入一个数123.45678,实际数据库里存的是123.457,但总位数还以实际为准,即6位。 |
real | 4字节的浮点值。 |
UNSIGNED
有符号或无符号 所有数值数据类型(除BIT和BOOLEAN外)都可以有符号或无符号。有符号数值列可以存储正或负的数值,无符号数值列只能存储正数。默认情况为有符号,但如果你知道自己不需要存储负值,可以使用UNSIGNED关键字,这样做将允许你存储两倍大小的值。
格式
- 不使用引号 与串不一样,数值不应该括在引号内。
- 存储货币数据类型 MySQL中没有专门存储货币的数据类型,一般情况下使用DECIMAL(8, 2)
类型3:日期和时间
其他网址
MySQL 日期与时间方面的函数 - MySQL 中文版 -
MySQL ADDDATE() Function
MySQL使用专门的数据类型来存储日期和时间值。
数值数据类型 | 说明 |
date | 表示1000-01-01~9999-12-31的日期,格式为yyyy-mm-dd |
datetime | DATE和TIME的组合 |
timestamp | 功能和DATETIME相同(但范围较小) |
time | 格式为HH:MM:SS |
year | 用2位数字表示,范围是70(1970年)~69(2069年),用4位数字表示,范围是1901年~2155年 |
对于这些时间相关的类型,可以设置为:插入时自动插入当前时间,更新时自动更新当前时间,如下:
CREATE TABLE `timestampTest` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
对于Navicat软件,也可以设置。注意,若是时间类型,点击后会有如下界面,需要手动输入CURRENT_TIMESTAMP,若选择“根据当前时间戳更新”则update时更新,否则,在创建时设为默认值就不变了。
类型4:二进制
二进制数据类型可存储任何数据(甚至包括二进制信息),如图像、多媒体、字处理文档等。
二进制数据类型 | 说明 |
binary(n) | 固定长度为 n 字节,其中 n 值从 1 到 8,000 ,存储空间为 n 字节 |
varbinary(n) | 可变长度,n 的取值范围为 1 至 8,000,存储空间以实际情况而定,小于等于n。 |
blob | 最大长度为65535 (2^16-1)字节 |
tinyblob | 最大长度为255 (2^8-1)字节 |
mediumblob | 最大长度为16777215 (2^24-1)字节 |
longblob | 最大长度为4294967295或4GB (2^32-1)字节 |
BLOB和TEXT在以下方面与VARBINARY和VARCHAR不同:
BLOB和TEXT列在存储或者读取时没有删除末尾的空白。在MySQL 5.0.3之前,这不同于 VARBINARY和VARCHAR,这两者在存储时会删除末尾的空白。
在比较中,TEXT是空间扩展的,以适应比较对象, 与CHAR和VARCHAR完全一样。
对于BLOB和TEXT列的索引,必须指定索引前缀的长度。对于CHAR和VARCHAR,前缀长度是可选的。见章节 7.5.1,“列索引”。
BLOB和TEXT列不能包含DEFAULT值。
英文:
BLOB and TEXT differ from VARBINARY and VARCHAR in the following ways:
There is no trailing-space removal for BLOB and TEXT columns when values are stored or retrieved. Before MySQL 5.0.3, this differs from VARBINARY and VARCHAR, for which trailing spaces are removed when values are stored.
On comparisons, TEXT is space extended to fit the compared object, exactly like CHAR and VARCHAR.
For indexes on BLOB and TEXT columns, you must specify an index prefix length. For CHAR and VARCHAR, a prefix length is optional. See Section 7.5.1, “Column Indexes”.
BLOB and TEXT columns cannot have DEFAULT values.
显示宽度
类型后边都可以跟一个(length),比如int(11)不写也有默认值。
显示宽只是指明Mysql最大可能显示的数字个数,数值的位数小于指定的长度时会在左侧补0填充;如果插入了大于显示长度的值,只要该值不超过该类型的取值范围,数值依然可以插入,而且显示出来。
以int为例:范围是-2^31(2147483648)~2^31-1(2147483647)。其最长的位数就是负数的最大长度了:11。
SQL与Java数据类型对应
java类型 | 数据库类型 | 备注 |
Boolean,boolean | BOOLEAN,BIT | 也可以用TINYINT等数字类型。此时,若Boolean为true对应数字类型的1。 |
Byte,byte | TINYINT | |
Short,short | SMALLINT | |
Integer,int | INTEGER | |
Long,long | BIGINT | |
Float,float | FLOAT | |
Double,double | DOUBLE | |
String | CHAR,VARCHAR | |
String | CLOB,LONGVARCHAR | |
String | NVARCHAR,NCHAR | |
String | NCLOB | |
Object | ARRAY | |
BigDecimal | REAL,DECIMAL,NUMERIC | |
byte[] | BLOB,LONGVARBINARY | |
Object | OTHER或者未指定类型 | |
Date,LocalDateTime | TIMESTAMP | 对于LocalDateTime、LocalDate、LocalTime,Mybatis-Plus从3.1.1开始,用Mybatis3.5.1,Mybatis 3.5.1版本对这几种类型的转换交由JDBC,若JDBC组件不支持其转换则报错。druid的1.1.21解决此问题。以下组合可用 mysql.connector.java 8.0.17 |
Date,LocalDate | DATE | |
Date,LocalTime | TIME | |
java.sql.Date | DATE | |
java.sql.Time | TIME | |
java.sql.Timestamp | TIMESTAMP | |
枚举类 | VARCHAR或兼容的字符串类型 |
其他网址
见《MySQL必知必会》=>附录D MySQL数据类型