【⑭MySQL | 数据类型(二)】字符串 | 二进制类型

前言

✨欢迎来到小K的MySQL专栏,本节将为大家带来MySQL字符串 | 二进制类型类型的分享✨

目录

  • 前言
      • 5 字符串类型
      • 6 二进制类型
      • 总结

        5 字符串类型

        字符串类型用来存储字符串数据,还可以存储图片和声音的二进制数据。字符串可以区分或者不区分大小写的串比较,还可以进行正则表达式的匹配查找。

        下表中列出了 MySQL 中的字符串数据类型,括号中的M表示可以为其指定长度。

        类型名称说明长度范围占用的存储空间
        CHAR(M)固定长度0<=M<=255M 个字节
        VARCHAR(M)变长字符串0<=M<=65535M+1个字节
        TINYTEXT非常小字符串0<=L<=255L+1字节
        TEXT小的字符串0<=L<=65535L+2字节
        MEDIUMTEXT中等大小的字符串0<=L<=16777215L+3字节
        LONGTEXT大的字符串0<=L<=4294967295L+4字节
        ENUM枚举类型,只能有一个枚举字符串值0<=L<=655351或2个字节,取决于枚举值的数目 (最大值为65535)
        SET字符串集合,字符串对象可以有零个或 多个SET成员0<=L<=641、2、3、4或8个字节,取决于集合 成员的数量(最多64个成员)

        CHAR 和 VARCHAR 类型

        CHAR 和 VARCHAR 类型都可以存储比较短的字符串。

        类型特点长度长度范围占用存储空间
        CHAR(M)固定长度M0<=M<=255M个字节
        VARCHAR(M)可变长度M0<=M<=65535(实际长度+1/2)个字节

        CHAR类型:

        • CHAR(M) 为固定长度字符串,在定义时指定字符串长度。如果不指定,则默认为1个字符。

        • 如果保存时,数据的实际长度比CHAR类型声明的长度小,则会在右侧填充空格以达到指定的长度。当检索 CHAR 值时,尾部的空格将被删除。

        • 定义CHAR类型字段时,申明的字段长度即为CHAR类型字段所占的存储空间的字节数。

          CREATE TABLE test_char
          (
          	f1 CHAR,
          	f2 CHAR(5)
          );
          DESC test_char;
          INSERT INTO test_char(f1) VALUES('h');
          #Data too long for column 'f1' at row 1
          INSERT INTO test_char(f1) VALUES('he');
          INSERT INTO test_char(f1) VALUES('你');
          INSERT INTO test_char(f2) VALUES('C语言');
          #Data too long for column 'f2' at row 1
          INSERT INTO test_char(f2) VALUES('C语言Plus');
          #测试在右侧填充的空格,会在查询的时候去掉的情况
          SELECT CONCAT(f2,'***') FROM test_char;
          #注意:自己插入的空格也会被去掉
          INSERT INTO test_char(f2) VALUES('fk  ');
          SELECT * FROM test_char;
          

          VARCHAR类型:

          • VARCHAR(M) 定义时,必须指定长度M,否则会报错。

          • VARCHAR(M)指的是能存储M个字符,而实际占用的空间为字符串的实际长度加 1或者2。

          • VARCHAR 在值保存和检索时尾部的空格仍保留。

            #错误,没有指定长度
            CREATE TABLE test_varchar
            (
            	name VARCHAR
            );
            CREATE TABLE test_varchar
            (
            	name VARCHAR(5)
            );
            INSERT INTO test_varchar VALUES('星星'),('太阳月亮');
            #Data too long forcolumn 'NAME' at row 1
            INSERT INTO test_varchar VALUES('星星太阳月亮');
            

            TEXT 类型

            TEXT用来保存文本类型的字符串,如文章内容、评论等。当保存或查询 TEXT 列的值时,不删除尾部空格。

            TEXT 类型分为 4 种:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。不同的 TEXT 类型的存储空间和数据长度不同。

            在向TEXT类型的字段插入数据时,系统自动按照实际长度存储,不需要预先定义长度。

            类型说明大小(字节)
            TINYTEXT小文本0<=L<=255
            TEXT普通文本0<=L<=65535
            MEDIUMTEXT中等大小文本0<=L<=16777215
            LONGTEXT长文本0<=L<=4294967295 (相当于4GB字符)

            TEXT文本类型,可以存储比较大的文本段,搜索速度稍慢,因此如果不是特别大的内容,建议使用CHAR,VARCHAR来替代。还有TEXT类型不用加默认值,加了也没用。

            ENUM 类型

            ENUM 类型也叫作枚举类型,ENUM类型的取值范围需要在定义字段是进行指定。设置字段值时,ENUM类型只允许从成员中选取单个值,不能一次选取多个值。如果创建的成员中有空格,尾部的空格将自动被删除。

            类型长度范围占用存储空间
            ENUM1<=L<=655351或2个字节
            • ENUM 值在内部用整数表示,每个枚举值均有一个索引值;
            • 列表值所允许的成员值从 1 开始编号,MySQL 存储的就是这个索引编号,枚举最多可以有 65535 个元素。

              ENUM 值依照列索引顺序排列,并且空字符串排在非空字符串前,NULL 值排在其他所有枚举值前。

              提示:ENUM 列总有一个默认值。如果将 ENUM 列声明为 NULL,NULL 值则为该列的一个有效值,并且默认值为 NULL。如果 ENUM 列被声明为 NOT NULL,其默认值为允许的值列表的第 1 个元素。

              • 查看enum字段的所有值
                SELECT
                column_type
                FROM
                information_schema. COLUMNS
                WHERE
                #TABLE_SCHEMA = "test" AND
                DATA_TYPE = 'enum'
                AND table_name="test_enum"
                AND column_name="ch";
                
                • 测试
                  CREATE TABLE test_enum
                  (
                  	gender ENUM('男','女','unknown')
                  );
                  INSERT INTO test_enum VALUES('男');
                  #Data truncated for column 'ch' at row 1
                  INSERT INTO test_enum VALUES('中');
                  #可以使用索引来插入枚举元素(注意:索引从1开始)
                  INSERT INTO test_enum VALUES(1),('2');
                  #当enum字段没有申明为NOT NULL时,插入NULL也是合法的
                  INSERT INTO test_enum VALUES(NULL);
                  SELECT * FROM test_enum;
                  

                  SET 类型

                  SET 是一个字符串的对象,可以有零或多个值,SET 列最多可以有 64 个成员,值为表创建时规定的一列值。

                  成员个数范围占用的存储空间
                  1<=L<=81个字节
                  9<=L<=162个字节
                  17<=L<=243个字节
                  25<=L<=324个字节
                  33<=L<=648个字节
                  • 与 ENUM 类型相同,SET 值在内部用整数表示,列表中每个值都有一个索引编号。当创建表时,SET 成员值的尾部空格将自动删除。

                  • 但与 ENUM 类型不同的是,ENUM 类型的字段只能从定义的列值中选择一个值插入,而 SET 类型的列可从定义的列值中选择多个字符的联合。

                    提示:如果插入 SET 字段中的列值有重复,则 MySQL 自动删除重复的值;插入 SET 字段的值的顺序并不重要,MySQL 会在存入数据库时,按照定义的顺序显示;

                    测试

                    CREATE TABLE test_set
                    (
                    	hobby SET('吃饭','睡觉','写Bug')
                    );
                    INSERT INTO test_set VALUES('吃饭');
                    INSERT INTO test_set VALUES('吃饭,睡觉');
                    #重复插入时,会自动删除重复数据
                    INSERT INTO test_set VALUES('吃饭,睡觉,吃饭');
                    #插入的值在set中不存在时,会报错
                    INSERT INTO test_set VALUES('吃饭,睡觉,花钱');
                    SELECT * FROM test_set;
                    

                    6 二进制类型

                    MySQL中的二进制字符串类型主要存储一些二进制数据,比如可以存储图片、音频、视频等二进制数据。

                    包括 BIT、BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。

                    下表中列出了 MySQL 中的二进制数据类型,括号中的M表示可以为其指定长度。

                    类型名称说明大小(字节)
                    BIT(M)位字段类型大约 (M+7)/8 字节
                    BINARY(M)固定长度二进制字符串M 字节
                    VARBINARY (M)可变长度二进制字符串M+1 字节
                    TINYBLOB (M)非常小的BLOBL+1 字节,在此,L<2^8
                    BLOB (M)小 BLOBL+2 字节,在此,L<2^16
                    MEDIUMBLOB (M)中等大小的BLOBL+3 字节,在此,L<2^24
                    LONGBLOB (M)非常大的BLOBL+4 字节,在此,L<2^32

                    BIT 类型

                    位字段类型。M 表示每个值的位数,范围为 1~64。如果 M 被省略,默认值为 1。如果为 BIT(M) 列分配的值的长度小于 M 位,在值的左边用 0 填充。例如,为 BIT(6) 列分配一个值 b’101’,其效果与分配 b’000101’ 相同。

                    BIT 数据类型用来保存位字段值,例如以二进制的形式保存数据 13,13 的二进制形式为 1101,在这里需要位数至少为 4 位的 BIT 类型,即可以定义列类型为 BIT(4)。大于二进制 1111 的数据是不能插入 BIT(4) 类型的字段中的。

                    提示:默认情况下,MySQL 不可以插入超出该列允许范围的值,因而插入数据时要确保插入的值在指定的范围内。

                    BINARY 和 VARBINARY 类型

                    BINARY 和 VARBINARY 类型类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字节字符串。使用的语法格式如下:

                    列名称 BINARY(M) 或者 VARBINARY(M)

                    BINARY 类型的长度是固定的,指定长度后,不足最大长度的,将在它们右边填充 “\0” 补齐,以达到指定长度。例如,指定列数据类型为 BINARY(3),当插入 a 时,存储的内容实际为 “a\0\0”,当插入 ab 时,实际存储的内容为“ab\0”,无论存储的内容是否达到指定的长度,存储空间均为指定的值 M。

                    VARBINARY 类型的长度是可变的,指定好长度之后,长度可以在 0 到最大值之间。例如,指定列数据类型为 VARBINARY(20),如果插入的值长度只有 10,则实际存储空间为 10 加 1,实际占用的空间为字符串的实际长度加 1。

                    BLOB 类型

                    BLOB 是一个二进制的对象,用来存储可变数量的数据。BLOB 类型分为 4 种:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB,它们可容纳值的最大长度不同,如下表所示。

                    数据类型存储范围
                    TINYBLOB最大长度为255 (28-1)字节
                    BLOB最大长度为65535 (216-1)字节
                    MEDIUMBLOB最大长度为16777215 (224-1)字节
                    LONGBLOB最大长度为4294967295或4GB (231-1)字节

                    BLOB 列存储的是二进制字符串(字节字符串),TEXT 列存储的是非进制字符串(字符字符串)。BLOB 列是字符集,并且排序和比较基于列值字节的数值;TEXT 列有一个字符集,并且根据字符集对值进行排序和比较。

                    总结

                    总的来说,选择合适的数据类型可以提高数据库的性能、节省存储空间、确保数据的一致性和有效性,并方便进行数据处理和计算。因此,在设计数据库时,选择合适的数据类型非常重要。~下节带来MySQL视图的分享