2、 BINARY和VARBINARY类型
BINARY和VARBINARY类型类似于CHAR和VARCHAR,不同的是它们包含二进制字节
字符串。其使用的语法格式如下:
列名称BINARY (M)或者VARBINARY (M)
BINARY类型的长度是固定的,指定长度之后,不足最大长度的,将在它们右边填充‘\0’齐以达到指定长度。例如:指定列数据类型为BINARY(3),当插入‘a’时,存储的内容实际为“a\0\0",当插入“ab” 时,实际存储的内容为“ab\0”,不管存储的内容是否达到指定的长度,其存储空间
VARBINARY类型的长度是可变的,指定好长度之后,其长度可以在0到最大值之间。例如: 指定列数据类型为VARBINARY(20),如果插入的值的长度只有10,则实际存储空间为10加1,即实际占用的空间为字符串的实际长度加1。
创建表tmp13,定义BINARY(3)类型的字段b和VARBINARY(3)类型的字段vb,并向表中插入数据’5’,比较两个字段的存储空间。
首先创建表tmp13,输入SQL语句如下:
mysql> CREATE TABLE tmp13( -> b binary(3), -> vb varbinary(30) -> ); Query OK, 0 rows affected (0.01 sec)
插入数据:
mysql> INSERT INTO tmp13 VALUES(5,5); Query OK, 1 row affected (0.00 sec)
查看两个字段存储数据的长度:
mysql> SELECT length(b), length(vb) FROM tmp13; +-----------+------------+ | length(b) | length(vb) | +-----------+------------+ | 3 | 1 | +-----------+------------+ 1 row in set (0.00 sec) mysql> SELECT b,vb,b = '5', b='5\0\0',vb='5',vb = '5\0\0' FROM tmp13; +------------+------------+---------+-----------+--------+--------------+ | b | vb | b = '5' | b='5\0\0' | vb='5' | vb = '5\0\0' | +------------+------------+---------+-----------+--------+--------------+ | 0x350000 | 0x35 | 0 | 1 | 1 | 0 | +------------+------------+---------+-----------+--------+--------------+ 1 row in set (0.00 sec)
3、BLOB类型
BLOB是一个二进制大对象,用来存储可变数量的数据。BLOB类型分为4种: TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB,它们可容纳值的最大长度不同,如下所示:
数据类型 | 存储范围 |
TINYBLOB | 最大长度为255 (2^8-1) B |
BLOB | 最大长度为65535 (2^6-1) B |
MEDIUMBLOB | 最大长度为16777215 (2^24-1) B |
LONGBLOB | 最大长度为4294967295 (2^32 -1) B |
BLOB列存储的是二进制字符串,
TEXT列存储的是非二进制字符串。
BLOB列没有字符集,并且排序和比较基于列值字节的数值;
TEXT列有一个字符集,并且根据字符集对值进行排序和比较。
2、 如何选择数据类型
2.1、MySQL整数与浮点数的选择
如果不需要小数部分,就使用整数来保存数据:如果需要表示小数部分,就使用浮点数类型。对于浮点数据列,存入的数值会对该列定义的小数位进行四舍五入。例如,假设列的值的范围为1~99999,若使用整数,则MEDIUMINT UNSIGNED是最好的类型;若需要存储小数,则使用FLOAT类型。浮点类型包括FLOAT和DOUBLE类型。DOUBLE类型精度比FLOAT类型高,因此要求存储精度较高时应选择DOUBLE类型。
2.2、MySQL浮点数与定点数的选择
浮点数FLOAT、DOUBLE相对于定点数DECIMAL的优势是:在长度一定的情况下, 浮点数能表示更大的数据范围。由于浮点数容易产生误差,因此对精确度要求比较高时,建议使用DECIMAL来存储。DECIMAL在MySQL中是以字符串存储的,用于定义货币等对精确度要求较高的数据。在数据迁移中,float(M,D)是 非标准SQL定义,数据库迁移可能会出现问题,最好不要这样使用。另外,两个浮点数进行减法和比较运算时也容易出问题,因此在进行计算的时候,一定要小心。进行数值比较时,最好使用DECIMAL类型。
2.3、MySQL日期与时间类型的选择
MySQL对于不同种类的日期和时间有很多数据类型,比如YEAR和TIME。如果只需要记录年份,则使用YEAR类型即可;如果只记录时间,则使用TIME类型。如果同时需要记录日期和时间,则可以使用TIMESTAMP或者DATETIME类型。由于TIMESTAMP列的取值范围小于DATETIME 的取值范围,因此存储范围较大的日期最好使用
DATETIME.TIMESTAMP也有一个DATETIME不具备的属性。默认的情况下,当插入一条记录但并没有指定TIMESTAMP这个列值时,MySQL会把TIMESTAMP列设为当前的时间。因此当需要插入记录的同时插入当前时间时,使用TMESTAMP是方便的。另外,TIMESTAMP 在空间上比DATETIME更有效。
2.4、MySQL的CHAR和VARCHAR之间的选择
CHAR是固定长度字符,VARCHAR 是可变长度字符。CHAR 会自动删除插入数据的尾部空格,VARCHAR 不会删除尾部空格。CHAR是固定长度,所以它的处理速度比VARCHAR的速度要快,但是它的缺点是浪费存储存储引擎对于选择CHAR和VARCHAR的影响:对于MyISAM存储引擎:最好使用固定长度的数据列代替可变长度的数据列。这样可以使整个表静态化,从而使数据检索更快,用空间换时间。
对于InnoDB存储引擎:使用可变长度的数据列,因为InnoDB数据表的存储格式不分固定长度和可变长度,因此使用CHAR不一定比使用VARCHAR更好,但由于VARCHAR是按照实际的长度存储的,比较节省空间,所以对磁盘I/O和数据存储总量比较好。
2.5、MySQL的ENUM和SET的选择
ENUM只能取单值,它的数据列表是一个枚举集合。 它的合法取值列表最多 允许有65535个成员。因此,在需要从多个值中选取一个时, 可以使用ENUM。比如:性别字段适合定义为ENUM类型,每次只能从‘男’或‘女’中取一个值。SET可取多值。它的合法取值列表最多允许有64个成员。空字符串也是一个合法的SET值。在需要取多个值的时候,适合使用SET类型,比如要存储一个人的兴趣爱好,最好使用SET类型。ENUM和SET的值是以字符串形式出现的,但在内部,MySQL 是以数值的形式存储它们的。
2.6、MySQL的BLOB和TEXT的选择
BLOB是二进制字符串,TEXT是非二进制字符串,两者均可存放大容量的信息。BLOB 主要
存储图片、音频信息等,而TEXT只能存储纯文本文件。
3、综合案例-MySQL数据库的数据类型的使用
1、案例要求
创建数据库myData,按照下面数据表格的要求创建数据表:myTable。
myTable表结构
字段名 | 数据类型 | 主键 | 外键 | 非空 | 唯一 | 自增 |
myInt | INT(10) | 否 | 否 | 否 | 否 | 否 |
myFloat | FLOAT(5,2) | 否 | 否 | 否 | 否 | 否 |
myTime | TIME | 否 | 否 | 否 | 否 | 否 |
myChar | CHAR(10) | 否 | 否 | 否 | 否 | 否 |
myBinary | binary(5) | 否 | 否 | 否 | 否 | 否 |
通过MySQL数据库的数据类型的使用,来达到掌握有关MySQL数据库的数据类型使用的能力。其具体要求如下所示:
1、创建数据库myData
2、创建数据表myTable
3、向数据表myTable插入INT类型数据
4、向数据表myTable插入FLOAT类型数据
5、向数据表myTable插入TIME类型数据
6、向数据表myTable插入CHAR类型数据
7、向数据表myTable插入BINARY类型数据
8、查询数据表myTable的数据
2、案例实现过程
一、cmd环境运行MySQL语句
2.1、创建数据库myData
mysql> CREATE DATABASE myData; Query OK, 1 row affected (0.00 sec)
2.2、创建数据表myTable
mysql> USE myData; Database changed mysql> CREATE TABLE myTable -> ( -> myInt INT(10), -> myFloat FLOAT(5,2), -> myTime TIME, -> myChar CHAR(10), -> myBinary BINARY(5) -> ); Query OK, 0 rows affected, 2 warnings (0.01 sec)
2.3、向数据表myTable插入INT类型数据
向myInt字段插入数据
mysql> INSERT INTO myTable(myInt) VALUES(666); Query OK, 1 row affected (0.00 sec)
查询myInt字段结果如下
mysql> SELECT myInt FROM myTable; +-------+ | myInt | +-------+ | 666 | +-------+ 1 row in set (0.00 sec)
2.4、向数据表myTable插入FLOAT类型数据
向myFloat字段插入数据
mysql> INSERT INTO myTable(myFloat) VALUES(6.23); Query OK, 1 row affected (0.00 sec)
查询myFloat字段结果如下
mysql> SELECT myFloat FROM myTable; +---------+ | myFloat | +---------+ | NULL | | 6.23 | +---------+ 2 rows in set (0.00 sec)
2.5、向数据表myTable插入TIME类型数据
向myTime字段插入数据
mysql> INSERT INTO myTable(myTime) VALUES('10:24:36'); Query OK, 1 row affected (0.00 sec)
查询myTime字段结果如下
mysql> SELECT myTime FROM myTable; +----------+ | myTime | +----------+ | NULL | | NULL | | 10:24:36 | +----------+ 3 rows in set (0.00 sec)
2.6、向数据表myTable插入CHAR类型数据
向myChar字段插入数据
mysql> INSERT INTO myTable(myChar) VALUES('CHAR'); Query OK, 1 row affected (0.00 sec)
查询myChar字段结果如下
mysql> SELECT myChar FROM myTable; +--------+ | myChar | +--------+ | NULL | | NULL | | NULL | | CHAR | +--------+ 4 rows in set (0.00 sec)
2.7、向数据表myTable插入BINARY类型数据
向myBinary字段插入数据
mysql> INSERT INTO myTable(myBinary) VALUES(3); Query OK, 1 row affected (0.00 sec)
查询myBinary字段结果如下
mysql> SELECT myBinary FROM myTable; +--------------------+ | myBinary | +--------------------+ | NULL | | NULL | | NULL | | NULL | | 0x3300000000 | +--------------------+ 5 rows in set (0.00 sec)
2.8、查询数据表myTable的数据
查询myTable的数据结果如下
mysql> SELECT * FROM myTable; +-------+---------+----------+--------+--------------------+ | myInt | myFloat | myTime | myChar | myBinary | +-------+---------+----------+--------+--------------------+ | 666 | NULL | NULL | NULL | NULL | | NULL | 6.23 | NULL | NULL | NULL | | NULL | NULL | 10:24:36 | NULL | NULL | | NULL | NULL | NULL | CHAR | NULL | | NULL | NULL | NULL | NULL | 0x3300000000 | +-------+---------+----------+--------+--------------------+ 5 rows in set (0.00 sec)
2.9、运行过程如下
1、登入数据库,创建数据库和数据表
2、向数据表中插入数据和查询数据
二、Navicat 软件环境运行MySQL语句
1、新建查询
进入Navicat软件好,新建一个创建数据库的查询。
在查询中编写如下的SQL语句,如下所示。
-- 1、创建数据库 CREATE DATABASE myData; -- 2、创建数据表myTable USE myData; CREATE TABLE myTable ( myInt INT(10), myFloat FLOAT(5,2), myTime TIME, myChar CHAR(10), myBinary BINARY(5) ); -- 3、向数据表myTable插入INT类型数据 -- 向myInt字段插入数据 INSERT INTO myTable(myInt) VALUES(666); -- 查询myInt字段 SELECT myInt FROM myTable; -- 4、向数据表myTable插入FLOAT类型数据 -- 向myFloat字段插入数据 INSERT INTO myTable(myFloat) VALUES(6.23); -- 查询myFloat字段结 SELECT myFloat FROM myTable; -- 5、向数据表myTable插入TIME类型数据 -- 向myTime字段插入数据 INSERT INTO myTable(myTime) VALUES('10:24:36'); -- 查询myTime字段 SELECT myTime FROM myTable; -- 6、向数据表myTable插入CHAR类型数据 -- 向myChar字段插入数据 INSERT INTO myTable(myChar) VALUES('CHAR'); -- 查询myChar字段 SELECT myChar FROM myTable; -- 7、向数据表myTable插入BINARY类型数据 -- 向myBinary字段插入数据 INSERT INTO myTable(myBinary) VALUES(3); -- 查询myBinary字段 SELECT myBinary FROM myTable; -- 8、查询数据表myTable的数据 SELECT * FROM myTable;
2、运行过程
运行结果如下所示:
1、创建数据库
2、创建数据表
3、插入和查询数据
4、总结
本文主要介绍了MySQL数据类型:
MySQL数据类型主要有整数类型、浮点类型、定点类型、日期和时间类型、字符串类型、文本类型和二进制类型。 使读者可以很快掌握MySQL数据类型的基本使用方法。另外还介绍了分别使用cmd环境和Navicat软件环境中使用MySQL数据库的数据类型的方法。