数据类型(data_type)
是指系统中所允许的数据的类型。
数值类型
整数类型包括 TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,浮点数类型包括 FLOAT 和 DOUBLE,定点数类型为 DECIMAL。
浮点类型和定点类型都可以用(M, D)来表示,其中M称为精度,表示总共的位数;D称为标度,表示小数的位数。
日期/时间类型
包括 YEAR、TIME、DATE、DATETIME 和 TIMESTAMP。
字符串类型
包括 CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT、ENUM、SET 等。
CHAR 和 VARCHAR 类型
固定长度不管实际为多少,都占用指定字节;可变长度则取决于实际字节。CHAR 会自动删除插入数据的尾部空格,VARCHAR 不会。
CHAR(4) 定义后,无论存入的数据长度为多少,占用均为 4 字节。VARCHAR(10) 定义的列所占的字节数为实际长度加 1。
TEXT 类型
TEXT 列保存非二进制字符串,TEXT 只能存储纯文本文件,如文章内容、评论等。当保存或查询 TEXT 列的值时,不删除尾部空格。
TEXT 分为 4 种:TINYTEXT 为 255字符、TEXT 为 65535字符、MEDIUMTEXT 为 16777215字符、LONGTEXT 为 4GB字符。
ENUM 类型
ENUM 是一个字符串对象,值为表创建时列规定中枚举的一列值。其语法格式如下:
字段名 ENUM( ‘值1’, ‘值2’, …, ‘值n’ )
”字段名“指将要定义的字段,“值 n ”指枚举列表中第 n 个值。
ENUM 只能取单值,它的数据列表是一个枚举集合。它的合法取值列表最多允许有 65 535个成员。因此,在需要从多个值中选取一个时,可以使用 ENUM。比如,性别字段适合定义,为 ENUM 类型,每次只能从‘男’或‘女’中取一个值。
SET 类型
SET 值在内部用整数表示,列表中每个值都有一个索引编号。当创建表时,SET 成员值的尾部空格将自动删除。与 ENUM 不同的是,ENUM 类型的字段只能从定义的列值中选择一个值插入,而 SET 类型的列可从定义的列值中选择多个字符的联合。
SET 可取多值。它的合法取值列表最多允许有 64 个成员。空字符串也是一个合法的 SET值。在需要取多个值的时候,适合使用 SET 类型,比如,要存储一个人兴趣爱好,最好使用SET类型。
二进制类型
包括 BIT、BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。
BLOB 是二进制字符串,主要存储图片、音频信息等。
存储引擎
存储引擎就是指表的类型。数据库的存储引擎决定了表在计算机中的存储方式。MySQL 5.7 支持的存储引擎有 InnoDB、MyISAM、Memory、Merge、Archive、Federated、CSV、BLACKHOLE 等。可以使用SHOW ENGINES;语句查看系统所支持的引擎类型。
1、MyISAM 不支持事务和外键,访问速度比较快。如应用以读和写为主,只有少量的更新和删除操作,并且对事务的完整性、并发性要求不是很高,那么 MyISAM 非常适合。
2、InnoDB 在事务上具有优势,支持具有提交、回滚和崩溃恢复能力的事务安装,所以比 MyISAM 存储引擎占用更多的磁盘空间。
如应用对事务的完整性高要求,在并发条件下要求数据的一致性,数据操作除了插入和查询,还包括很多的更新、删除,那么 InnoDB 合适。除了可以有效地降低由于删除和更新导致的锁定,还可以确保事务的完整提交(Commit)和回滚(Rollback),对于类似计费系统或者财务系统等对数据准确性要求比较高的系统,InnoDB 都是合适的。
3、MEMORY 将所有数据保存在 RAM 中,数据访问速度快,但安全没有保障。对表的大小有限制,太大的表无法缓存在内存中。由于没有安全保障,所以要确保表中的数据可以恢复。
查看和修改默认存储引擎
查看默认的存储引擎:
SHOW VARIABLES LIKE ‘default_storage_engine%’;
修改数据库临时的默认存储引擎:重启客户端时会恢复原来的值
SET default_storage_engine= 存储引擎名
永久修改默认的存储引擎,就需要修改 my.cnf 配置文件。在 [mysqld] 后面加入以下语句:
default-storage-engine=存储引擎名称
修改数据表的存储引擎
ALTER TABLE <表名> ENGINE=<存储引擎名>;