从头开始学MySQL--------数据类型(2)
5.1.4 字符串类型
(1)char与varchar
长度是否可变,具体长度是什么,存的时候,取的时候
char是固定长度的字符串,字符串长度由定义的时候指明。如果插入的字符串没有达到定义的长度,那么就用空格补充。在取出的时候,会去掉尾部的所有空格。例如,插入‘a’到char(4)中的结果是'a ',即字符a加上3个空格。
varchar是可变长类型的字符串。字符串长度是其实际插入的字符串长度。如果超过定义的字符串最大长度,那么要么截取字符串,要么就报错。varchar会保留住插入的字符串的空格。在取出数据的时候,也会把空格一并取出。 varchar(4) 如果插入 a+4空格,结果只插入了a+3空格,因为不能超过定义的字符串长度。
CREATE TABLE t_char
(
sex CHAR(1),
name VARCHAR(255)
);
何时该用CHAR,何时该用varchar2?
varchar比char节省空间,但是效率上比char要低。
如果一个字符串经常被修改,并且每次修改的长度都可能不一样,那么如果用varchar可能会造成‘行迁移’现象。这种情况下用char比较好。
行迁移:如果一块数据磁盘空间无法保存某个数据时(比如以前是1k,现在update到2k,而当前块的空闲空间不足1k),则会将新的数据保存到另外一个新的块里,然后在以前的块保存一个新位置的地址连接。
(2)TEXT类型
text是可变长类型。查询和插入TEXT列的值的时候,不会删除尾部的空格。一般用于文章内容、评论等较大文件的信息。
TEXT的最大长度是65535(2^16-1)。LONGTEXT最大长度为4GB,可见这个多么大。
(3)ENUM枚举类型
enum要求插入的数据必须是规定的数据。并且,按照enum中定义的顺序从1开始,记录索引。枚举值的空格将会被自动删除。
CREATE TABLE t_score
(
score INT,
level ENUM('excellent ','good','bad') //枚举值的尾部空格会被自动删除
);
INSERT INTO t_score(score,level) VALUES(99,'excellent');
INSERT INTO t_score(score,level) VALUES(99,1);
INSERT INTO t_score(score,level) VALUES(89,2);
INSERT INTO t_score(score,level) VALUES(59,3);
//INSERT INTO t_score(score,level) VALUES(59,'nice'); //报错:Data truncated for column 'level' at row 1
(4)SET枚举类型
SET类型与ENUM类型大致一样。但是允许一次插入多个值,用逗号隔开。插入的值会按照索引的值自动排序。
不允许插入SET规定的以外的值。
CREATE TABLE t_set
(
choice SET('A','B','C','D')
);
INSERT INTO t_set(choice) VALUES('A');
INSERT INTO t_set(choice) VALUES('A,B');
INSERT INTO t_set(choice) VALUES('B,A');
INSERT INTO t_set(choice) VALUES('B,A,A,D,C');
SELECT * FROM t_set;
(5)BLOB
BLOB字段存储的是二进制数据。而TEXT存储的是非二进制字符串。
BLOB的容量是64K,MEDIUMBLOB是16M,LONGBLOB是4G。
如何选择数据类型
为了提高数据库性能,应该使用最精准的类型。
(1)整数和浮点数
不需要小数的情况,使用整数。需要小数的情况使用浮点数。
精度要求较高的时候,使用DOUBLE而不是FLOAT。
(2)浮点数与定点数
浮点数的优点在于能表示更大的数据范围,缺点是浮点数的计算容易产生误差。(有四舍五入)
浮点数 FLOAT(M,D)因为是非标准SQL定义,在数据库迁移的时候容易产生误差。
定点数因为内部使用的是字符串的形式存储的,所以适用于精度较高的场景,比如金额。
另外,如果要进行数值比较,最好使用DECIMAL类型。
(3)时间与日期类型
只记录年份用 YEAR,只记录时间用TIME。
存储时间较大范围的用DATETIME,比如公元多少多少年。
当插入一条数据没有指定TIMESTAMP的时候,MySQL会自动用当前时间填充此列。如下SQL展示的那样。
CREATE TABLE `t_tempp` ( `id` int(11) DEFAULT NULL, `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8 INSERT INTO t_tempp(id) VALUES(3);
(4)CHAR与VARCHAR
CHAR是固定长度,VARCHAR是可变长度。
CHAR的长度由定义的时候指明,若字符串长度不够,那么就使用空格填充。VARCHAR的长度是实际存放的长度,若插入的数据超过定义的最大长度,那么要么报错,要么只截取前最大长度位字符串。
CHAR在取出的时候会删除空格,而VARCHAR会保留空格。
CHAR的处理速度比VARCHAR快,缺点就是浪费存储空间。如果存储数据不大,且对速度有要求,那么可以使用CHAR。
(5)ENUM与SET
ENUM适合定义一次只能获取一个值。它也限制了插入的时候,只能插入一个值,比如性别。
SET适合定义多个值,比如选项ABCD。插入的时候能够一次插入多个要求的值。获取的话也是获取多个值,用逗号隔开。
ENUM与SET显示的是字符串,但是内部使用的是数值存储。
(6)BLOB与TEXT
BLOB存储的是二进制的字符串,而TEXT存储的是非二进制的字符串。
BLOB能够存储图片、视频、音频,TEXT只能存放纯文本。