MySQL数据类型介绍
一、数据类型简介
- 数据表由多列字段构成,每一个字段指定了不同的数据类型,指定了数据类型之后,也就决定了向字段
插入的数据内容- 不同的数据类型也决定了 MySQL 在存储它们的时候使用的方式,以及在使用它们的时候选择什么运算符
号进行运算 - 数值数据类型:TINYINT 、SMALINT 、MEDIUMINT 、INT 、BIGINT 、FLOAT 、DOUBLE 、DECIMAL
- 日期/时间类型:YEAR 、TIME 、DATE 、DATETIME 、TIMESTAMP
- 字符串类型:CHAR 、VARCHAR 、BINARY 、VARBINARY 、BLOB 、TEXT 、ENUM 、SET
二、数值类型简介 - 数值类型主要用来存储数字,不同的数值类型提供不同的取值范围,可以存储的值范围越大,所需要的
存储空间也越大 - 数值类型分为:①整数类型 ②浮点数类型 ③定点数类型
1、整数类型
- 不同的数据类型也决定了 MySQL 在存储它们的时候使用的方式,以及在使用它们的时候选择什么运算符
2、浮点数类型和定点数类型
- MySQL 中使用浮点数和定点数来表示小数,浮点数有两种类型:单精度浮点数(FLOAT)和双精度浮点
数(DOUBLE),定点数只有 DECIMAL - 浮点数和定点数都可以用 (M,N) 来表示,其中 M 是精度,表示总共的位数,N 是标度,表示小数的位
数 - DECIMAL 实际是以字符串形式存放的,在对精度要求比较高的时候(如货币、科学数据等)使用
DECIMAL 类型会比较好 - 浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的数据范围,它的缺点是会引起精度问题
MySQL 日期/时间类型
- MySQL 有多种表示日期的数据类型,比如,当只记录年信息的时候,可以使用 YEAR 类型,而没有必要使用 DATE 类型
- 每一个类型都有合法的取值范围,当指定确实不合法的值时系统将 "零" 值插入到数据库中
1、YEAR
- 格式:以4位字符串格式表示的 YEAR ,范围为 '1901' ~ '2155'
- 格式:以4位数字格式表示的 YEAR ,范围为 1901 ~ 2155
- 格式:以2位字符串格式表示的 YEAR ,范围为 '00' ~ '99' ,其中,'00' ~ '69' 被转换为 2000 ~ 2069,'70' ~ '99' 被转换为 1970 ~ 1999
- 格式:以2位数字格式表示的 YEAR ,范围为 1 ~ 99 ,其中,1 ~ 69 被转换为 2001 ~ 2069 ,70 ~ 99 被转换为 1970 ~ 1999
2、TIME - TIME 类型的格式为 HH:MM:SS ,HH 表示小时,MM 表示分钟,SS 表示秒
- 格式:以 'HHMMSS' 格式表示的 TIME ,例如 '101112' 被理解为 10:11:12 ,但如果插入不合法的时间,如 '109712' ,则被存储为 00:00:00
- 格式:以 'D HH:MM:SS' 字符串格式表示的 TIME ,其中 D 表示日,可以取 0 ~ 34 之间的值,在插入数据库的时候 D 会被转换成小时,如 '2 10:10' 在数据库中表示为 58:10:00 ,即 2x24+10 = 58
3、DATE
- DATE 类型的格式为 YYYY-MM-DD ,其中,YYYY 表示年,MM 表示月,DD 表示日
- 格式:'YYYY-MM-DD' 或 'YYYYMMDD' ,取值范围为 '1000-01-01' ~ '9999-12-3'
- 格式:'YY-MM-DD' 或 'YYMMDD' ,这里 YY 表示两位的年值,范围为 '00' ~ '99' ,其中,'00' ~ '69' 被转换为 2000 ~ 2069 ,'70' ~ '99' 被转换为 1970 ~ 1999
- 格式:YY-MM-DD 或 YYMMDD ,数字格式表示的日期,其中 YY 范围为 00 ~ 99 ,其中,00 ~ 69 被转换为 2000 ~ 2069 ,70 ~ 99 被转换为 1970 ~ 1999
4、DATETIME - DATETIME 类型的格式为 YYYY-MM-DD HH:MM:SS ,其中,YYYY 表示年,MM 表示月,DD 表示日,HH 表示小时,MM 表示分钟,SS 表示秒
- 格式:'YYYY-MM-DD HH:MM:SS' 或 'YYYYMMDDHHMMSS' ,字符串格式,取值范围为 '1000-01-0100:00:00' ~ '9999-12-31 23:59:59'
- 格式:'YY-MM-DD HH:MM:SS' 或 'YYMMDDHHMMSS' ,字符串格式,其中 YY 范围为 '00' ~ '99' ,其中,'00' ~ '69' 被转换为 2000 ~ 2069 ,'70' ~ '99' 被转换为 1970 ~ 1999
- 格式:YYYYMMDDHHMMSS 或 YYMMDDHHMMSS ,数字格式,取值范围同上
5、TIMESTAMP - TIMESTAMP 类型的格式为 YYYY-MM-DD HH:MM:SS,显示宽度固定在19个字符
- TIMESTAMP 与 DATETIME 的区别在于,TIMESTAMP 的取值范围小于 DATETIME 的取值范围
- TIMESTAMP 的取值范围为 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC ,其中 UTC 是世界标准时间,存储时会对当前时区进行转换,检索时再转换回当前时区
二、字符串类型 - 字符串类型用来存储字符串数据,还可以存储比如图片和声音的二进制数据
- MySQL 支持两种字符串类型:文本字符串和二进制字符串
- CHAR(M) 为固定长度的字符串,在定义时指定字符串列长,当保存时在右侧填充空格以达到指定的长度,M 表示列长度,取值范围是 0~255 个字符,例如,CHAR(4) 定义了一个固定长度的字符串列,其包含的字符个数最大为 4,当检索到 CHAR 值时,尾部的空格将被删掉
- VARCHAR(M) 为可变长度的字符串,M 表示最大列长度,取值范围是 0~65535 ,VARCHAR 的最大实际长度由最长的行的大小和使用的字符集确定,而其实际占用的空间为字符串的实际长度加一(一个字符串结束符) 插入值 CHAR(4) 存储需求 VARCHAR(4) 存储需求 '' ' ' 4个字节 ' 1个字节 'ab' 'ab ' 4个字节'ab' 3个字节 'abc' 'abc' 4个字节 'abc' 4个字节 'abcd' 'abcd' 4个字节 'abcd' 5个字节 'abcde' 'abcd' 4个字节 'abcd' 5个字节
2、TEXT - TINYTEXT 最大长度为 255 个字符
- TEXT 最大长度为 65536 个字符
- MEDIUMTEXT 最大长度为 16777215 个字符
-
LONGTEXT 最大长度为 4294967295 个字符
3、ENUM
(1) 在基本的数据类型中,无外乎就是些数字和字符,但是某些事物是较难用数字和字符来准确地表示的。比如一周有七天,分别是Sunday、Monday、Tuesday、Wednesday、Thursday、Friday 和 Saturday。如果我们用整数 0、1、2、3、4、5、6 来表示这七天,那么多下来的那些整数该怎么办?而且这样的设置很容易让数据出错,即取值超出范围。我们能否自创一个数据类型,而数据的取值范围就是这七天呢?因此有了 ENUM 类型(Enumeration,枚举),它允许用户自己来定义一种数据类型,并且列出该数据类型的取值范围。ENUM 是一个字符串对象,其值为表创建时在列规定中枚举(即列举)的一列值,语法格式为:字段名 ENUM ('值1', '值2', ..... '值n') 字段名指将要定义的字段,值 n 指枚举列表中的第 n 个值,ENUM类型的字段在取值时,只能在指定的枚举列表中取,而且一次只能取一个。如果创建的成员中有空格时,其尾部的空格将自动删除。ENUM 值在内部用整数表示,每个枚举值均有一个索引值:列表值所允许的成员值从 1 开始编号,MySQL 存
储的就是这个索引编号。枚举最多可以有 65535 个元素。mysql> CREATE TABLE tmp10 -> ( -> soc INT, -> level ENUM('excellent', 'good', 'bad') # 自定义枚举值 -> ); mysql> INSERT INTO tmp10 values (70,'good'), (90,1), (75,2), (50,3) ; # 插入数据,后面三个是根据索引来插入的 mysql> INSERT INTO tmp10 values (100,'best') ; # 如果插入一个没有定义过的枚举值'best'会报错 ERROR 1265 (01000): Data truncated for column 'level' at row 1 mysql> SELECT * FROM tmp10; +------+-----------+ | soc | level | +------+-----------+ | 70 | good | | 90 | excellent | | 75 | good | | 50 | bad | +------+-----------+
4、SET
- SET 是一个字符串对象,可以有零个或多个值,SET 列最多可以有 64 个成员,其值为表创建时规定的一列值,语法:SET('值1','值2',...... '值n') 2. 与 ENUM 类型相同,SET 值在内部用整数表示,列表中每一个值都有一个索引编号
- 与 ENUM 类型不同的是,ENUM 类型的字段只能从定义的列值中选择一个值插入,而 SET 类型的列可从定义的列值中选择多个字符的联合
- 如果插入 SET 字段中列值有重复,则 MySQL 自动删除重复的值,插入 SET 字段的值的顺序并不重要,MySQL 会在存入数据库时,按照定义的顺序显示
mysql> CREATE TABLE tmp11 ( s SET('a', 'b', 'c', 'd') ); # 自定义SET字段的值
mysql> INSERT INTO tmp11 values ('a'), ('a,b,a'), ('c,a,d') ; # 只能插入自定义的SET字段的值
mysql> INSERT INTO tmp11 values ('a,x,b,y'); # 如果插入的不是自定义的值会报错
ERROR 1265 (01000): Data truncated for column 's' at row 1
mysql> SELECT * FROM tmp11;
+-------+
| s |
+-------+
| a |
| a,b |
| a,c,d |
+-------+
5、BIT
- BIT 数据类型用来保存位字段值,即以二进制的形式来保存数据,如保存数据 13,则实际保存的是 13 的二进制值,即 1101
- BIT 是位字段类型,BIT(M) 中的 M 表示每个值的位数,范围为 1~64 ,如果 M 被省略,则默认为 1 ,如果为 BIT(M) 列分配的值的长度小于 M 位,则在值得左边用 0 填充
- 如果需要位数至少为 4 位的 BIT 类型,即可定义为 BIT(4) ,则大于 1111 的数据是不能被插入的
mysql> CREATE TABLE tmp12( b BIT(4) ) ; mysql> INSERT INTO tmp12 VALUES (2), (9), (15) ; mysql> SELECT BIN(b+0) FROM tmp12; +----------+ | BIN(b+0) | +----------+ | 10 | | 1001 | | 1111 | +----------+
6、BINARY 和 VARBINARY
- BINARY 和 VARBINARY 类型类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字节字符串
- BINARY 类型的长度是固定的,指定长度之后,不足最大长度的,将在它们右边填充 '\0' 以补齐指定长度
- VARBINARY 类型的长度是可变的,指定长度之后,其长度可以在 0 到最大值之间
mysql> CREATE TABLE tmp13 -> ( -> b BINARY(3), # 定义固定长度为3的BINARY类型 -> vb VARBINARY(30) # 定义可变长度为30的VARBINARY类型 -> ); mysql> INSERT INTO tmp13 VALUES(5,5); mysql> SELECT * FROM tmp13; +------+------+ | b | vb | +------+------+ | 5 | 5 | +------+------+ mysql> SELECT length(b), length(vb) FROM tmp13; +-----------+------------+ | length(b) | length(vb) | +-----------+------------+ # BINARY占用的空间为固定的指定的值 | 3 | 1 | # VARBINARY占用的空间为可变的插入的值 +-----------+------------+
7、BLOB
- BLOB 用来存储可变数量的二进制字符串,分为 TINYBLOB 、BLOB 、MEDIUMBLOB 、LONGBLOB 四种类型
- BLOB 存储的是二进制字符串,TEXT 存储的是文本字符串
- BLOB 没有字符集,并且排序和比较基于列值字节的数值;TEXT 有一个字符集,并且根据字符集对值进行排序和比较 数据类型 |存储范围| ---|---|---| TINYBLOB |最大长度为255 BLOB |最大长度为65535MEDIUMBLOB| 最大长度为16777215 LONGBLOB |最大长度为4294967295
三、运算符介绍
1、MySQL算术运算符
mysql> CREATE TABLE tmp14 ( num INT ) ;
mysql> INSERT INTO tmp14 VALUE(64);
mysql> SELECT num, num+10, num-3, num*3, num/3, num%3 FROM tmp14;
+------+--------+-------+-------+---------+-------+
| num | num+10 | num-3 | num*3 | num/3 | num%3 |
+------+--------+-------+-------+---------+-------+
| 64 | 74 | 61 | 192 | 21.3333 | 1 |
+------+--------+-------+-------+---------+-------+
1、等于运算符 ( = )
等于运算符用来判断数字、字符串和表达式是否相等,如果相等,则返回值为 1 ,否则返回值为 0 ,如果有一个值是 NULL ,则比较结果为 NULL
mysql> SELECT 1=0, '2'=2, (1+3)=(2+2), NULL=NULL ;
+-----+-------+-------------+-----------+
| 1=0 | '2'=2 | (1+3)=(2+2) | NULL=NULL |
+-----+-------+-------------+-----------+
| 0 | 1 | 1 | NULL |
+-----+-------+-------------+-----------+
2、安全等于运算符 ( <=> )
这个操作符和等于运算符(=)的作用一致,只不过多了一个功能,就是可以判断 NULL 值
mysql> SELECT 1<=>0, '2'<=>2, (1+3)<=>(2+2), NULL<=>NULL ;
+-------+---------+---------------+-------------+
| 1<=>0 | '2'<=>2 | (1+3)<=>(2+2) | NULL<=>NULL |
+-------+---------+---------------+-------------+
| 0 | 1 | 1 | 1 |
+-------+---------+---------------+-------------+
3、不等于运算符 ( <> 或 != )
不等于运算符用于判断数字、字符串、表达式是否不相等,如果不相等则返回 1,否则返回 0 ,但是不能判断NULL 值
mysql> SELECT 'good'<>'god', 1<>2, 4!=4, 5.5!=5, NULL<>NULL ;
+---------------+------+------+--------+------------+
| 'good'<>'god' | 1<>2 | 4!=4 | 5.5!=5 | NULL<>NULL |
+---------------+------+------+--------+------------+
| 1 | 1 | 0 | 1 | NULL |
+---------------+------+------+--------+------------+
4、IS NULL 、ISNULL 、IS NOT NULL
- IS NULL 和 ISNULL 检验一个值是否为 NULL ,如果为 NULL ,返回值为 1,否则返回值为 0
- IS NOT NULL 检验一个值是否不为 NULL ,如果不为 NULL ,返回值为 1,否则返回值为 0
mysql> SELECT NULL IS NULL, ISNULL(NULL), ISNULL(10), 10 IS NOT NULL ; +--------------+--------------+------------+----------------+ | NULL IS NULL | ISNULL(NULL) | ISNULL(10) | 10 IS NOT NULL | +--------------+--------------+------------+----------------+ | 1 | 1 | 0 | 1 | +--------------+--------------+------------+----------------+
5、BETWEEN AND
用于判断一个值是否落在两个值之间mysql> SELECT 4 BETWEEN 2 AND 5, 4 BETWEEN 4 AND 6, 12 BETWEEN 9 AND 10 ; +-------------------+-------------------+---------------------+ | 4 BETWEEN 2 AND 5 | 4 BETWEEN 4 AND 6 | 12 BETWEEN 9 AND 10 | +-------------------+-------------------+---------------------+ | 1 | 1 | 0 | +-------------------+-------------------+---------------------+
6、LEAST 、GREATEST
- LEAST :当有两个或多个参数时,返回最小值,如果有一个值是 NULL ,则返回结果为 NULL
- GREATEST :当有两个或多个参数时,返回最大值,如果有一个值是 NULL ,则返回结果为NULL
mysql> SELECT LEAST(2,0), LEAST('a','c','b'), LEAST(10,NULL), GREATEST(2,0), GREATEST(10,NULL) ; +------------+--------------------+----------------+---------------+-------------- -----+ | LEAST(2,0) | LEAST('a','c','b') | LEAST(10,NULL) | GREATEST(2,0) | GREATEST(10,NULL) | +------------+--------------------+----------------+---------------+-------------- -----+ | 0 | a | NUL | 2 | NULL | +------------+--------------------+----------------+---------------+-------------------+
7、IN 、NOT IN
- IN :判断一个值是否是 IN 列表中的任意一个值
- NOT IN :判断一个值是否不是 IN 列表中的任意一个值
mysql> SELECT 2 IN (1,3,5), 2 NOT IN (1,3,5) ; +--------------+------------------+ | 2 IN (1,3,5) | 2 NOT IN (1,3,5) | +--------------+------------------+ | 0 | 1 | +--------------+------------------+
8、LIKE
- LIKE 运算符用来匹配字符串,如果匹配则返回 1,如果不匹配则返回 0
- LIKE 使用两种通配符:'%' 用于匹配任何数目的字符,包括零字符 ; '_' 只能匹配一个字符
mysql> SELECT 'stud' LIKE 'stu_', 'stud' LIKE 's___', 'stud' LIKE '%d' ; +--------------------+--------------------+------------------+ | 'stud' LIKE 'stu_' | 'stud' LIKE 's___' | 'stud' LIKE '%d' | +--------------------+--------------------+------------------+ | 1 | 1 | 1 | +--------------------+--------------------+------------------+
9、REGEXP
- REGEXP 运算符用来匹配字符串,如果匹配则返回 1,如果不匹配则返回 0
- REGEXP 使用几种通配符:
'^' 用于匹配以什么开头的字符串 '$' 用于匹配以什么结尾的字符串 '.' 用于匹配任何一个单字符串 '[...]' 用于匹配在方括号内的任何字符 '*' 用于匹配零个或多个在它前面的字符
mysql> SELECT 'ssky' REGEXP '^s', 'ssky' REGEXP 'y$', 'ssky' REGEXP '.sky', 'ssky' REGEXP '[ab]' ; +--------------------+--------------------+----------------------+---------------- ------+ | 'ssky' REGEXP '^s' | 'ssky' REGEXP 'y$' | 'ssky' REGEXP '.sky' | 'ssky' REGEXP '[ab]' | +--------------------+--------------------+----------------------+---------------- ------+ | 1 | 1 | 1 | 0 | +--------------------+--------------------+----------------------+---------------- ------+
四、MySQL逻辑运算符
运算符 作用 NOT 或 ! 逻辑非 AND 或 && 逻辑与 OR 或 || 逻辑或 XOR 逻辑异或
1、逻辑非 ( NOT 或 !)
- 当操作数为 0 时,所得值为 1
- 当操作数为非 0 时,所得值为 0
- 当操作数为 NULL 时,所得值为 NULL
mysql> SELECT NOT 10, !10, NOT (1-1), !(1-1), NOT 1+1, NOT NULL ; +--------+-----+-----------+--------+---------+----------+ | NOT 10 | !10 | NOT (1-1) | !(1-1) | NOT 1+1 | NOT NULL | +--------+-----+-----------+--------+---------+----------+ | 0 | 0 | 1 | 1 | 0 | NULL | +--------+-----+-----------+--------+---------+----------+
2、逻辑与 ( AND 或 && )
- 当所有操作数均为非零值、并且不为 NULL 时,所得值为 1
- 当一个或多个操作数为 0 时,所得值为 0
- 其余情况所得值为 NULL
mysql> SELECT 1 AND -1, 1 && 0, 0 AND NULL, 1 && NULL ; +----------+--------+------------+-----------+ | 1 AND -1 | 1 && 0 | 0 AND NULL | 1 && NULL | +----------+--------+------------+-----------+ | 1 | 0 | 0 | NULL | +----------+--------+------------+-----------+
3、逻辑或 ( OR 或 || )
- 当两个操作数均为非 NULL 值,且任意一个操作数为非零值时,结果为 1 ,否则为 0
- 当有一个操作数为 NULL ,且另一个操作数为非零值时,则结果为 1 ,否则结果为 NULL
- 当两个操作数均为 NULL 时,则所得结果为 NULL
mysql> SELECT 1 OR -1 OR 0, 1 || 2, 0 OR NULL, NULL || NULL ;
+--------------+--------+-----------+--------------+
| 1 OR -1 OR 0 | 1 || 2 | 0 OR NULL | NULL || NULL |
+--------------+--------+-----------+--------------+
| 1 | 1 | NULL | NULL |
+--------------+--------+-----------+--------------+**4、逻辑异或 ( XOR )**
- a XOR b 的计算等同于 ( a AND (NOT b) ) 或 ( (NOT a) AND b )
- 当任意一个操作数为 NULL 时,返回值为 NULL
- 对于非 NULL 的操作数,如果两个操作数都是非 0 值或者都是 0 值,则返回结果为 0
- 如果一个为 0 值,另一个为非 0 值,返回结果为 1
mysql> SELECT 1 XOR 1, 0 XOR 0, 1 XOR 0, 1 XOR NULL, 1 XOR 1 XOR 1 ; +---------+---------+---------+------------+---------------+ | 1 XOR 1 | 0 XOR 0 | 1 XOR 0 | 1 XOR NULL | 1 XOR 1 XOR 1 | +---------+---------+---------+------------+---------------+ | 0 | 0 | 1 | NULL | 1 | +---------+---------+---------+------------+---------------+
五、位运算符
运算符 作用 | 位或 & 位与 ^ 位异或 << 位左移 >> 位右移 ~ 位取反
1、位或运算符 ( | ) :对应的二进制位有一个或两个为 1 ,则该位的运算结果为 1 ,否则为 0
mysql> SELECT 10 | 15 , 9 | 4 | 2 ; +---------+-----------+ | 10 | 15 | 9 | 4 | 2 | # 10的二进制为1010,15的二进制为1111,按位或运算之后结果为 1111,即15 +---------+-----------+ # 9的二进制为1001,4为0100,2的二进制为0010,按位或运算之后 1111 | 15 | 15 | +---------+-----------+
2、位与运算符 ( & ) :对应的二进制位都为 1 ,则该位的运算结果为 1 ,否则为 0
mysql> SELECT 10 & 15 , 9 & 4 & 2 ; +---------+-----------+ | 10 & 15 | 9 & 4 & 2 | +---------+-----------+ | 10 | 0 | +---------+-----------+
3、位异或运算符 ( ^ ) :对应的二进制位不相同时,结果为 1 ,否则为 0
mysql> SELECT 10 ^ 15 , 1 ^ 0 , 1 ^ 1 ;
+---------+-------+-------+
| 10 ^ 15 | 1 ^ 0 | 1 ^ 1 |
+---------+-------+-------+
| 5 | 1 | 0 |
+---------+-------+-------+
4、位左移运算符 ( << ) :使指定的二进制位都左移指定的位数,左移指定位之后,左边高位的数值将被移出并丢弃,右边低位空出的位置用 0 补齐
mysql> SELECT 1<<2 , 4<<2 ;
+------+------+
| 1<<2 | 4<<2 | # 1的二进制值为00000001,左移两位之后变成00000100,即十进制数4
+------+------+ # 4的二进制值为00000100,左移两位之后变成00010000,即十进制数16
| 4 | 16 |
+------+------+
5、位右移运算符 ( >> ) :使指定的二进制位都右移指定的位数,右移指定位之后,右边低位的数值将被移出并丢弃,左边高位空出的职位用 0 补齐
mysql> SELECT 1>>1 , 16>>2 ;
+------+-------+
| 1>>1 | 16>>2 |
+------+-------+
| 0 | 4 |
+------+-------+
6、位取反运算符 ( ~ ) :将对应的二进制数逐位反转,即 1 取反后变 0 , 0 取反后变 1
mysql> SELECT 5 & ~1 ;
+--------+
| 5 & ~1 |
+--------+
| 4 |
+--------+