从头开始学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只能存放纯文本。

 

阅读更多

         目录贴:从头开始学MySQL-------目录帖

posted @ 2022-07-17 12:15  小大宇  阅读(31)  评论(0编辑  收藏  举报