zoukankan      html  css  js  c++  java
  • MySQL 字符类型

    字符类型

       MySQL提供了多种关于字符存储的类型,但是在大多数情况下我们只使用charvarchar即可

    类型大小用途
    CHAR 0 - 255字节 定长字符串
    VARCHAR 0 - 65535 字节 变长字符串
    TINYBLOB 0 - 255字节 不超过 255 个字符的二进制字符串
    TINYTEXT 0 - 255字节 短文本字符串
    BLOB 0 - 65 535字节 二进制形式的长文本数据
    TEXT 0 - 65 535字节 长文本数据
    MEDIUMBLOB 0 - 16 777 215字节 二进制形式的中等长度文本数据
    MEDIUMTEXT 0 - 16 777 215字节 中等长度文本数据
    LONGBLOB 0 - 4 294 967 295字节 二进制形式的极大文本数据
    LONGTEXT 0 - 4 294 967 295字节 极大文本数据

    字符集

      字符串分二进制与非二进制类型,二进制用于储存图片、声音等文件,非二进制用于储存文本数据。

      非二进制文本受字符集和校对规则影响。

      其实字符集说白了就是字符编码。

    概念解析

      字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同。常用的字符集有GBKBIG5UTF8

      UTF8字符集包含文字内容更广,如韩文、日文、德文兼容度更高,也是推荐使用的字符集(UTF8MB4)。

    表不设置字符集继承数据库,字段不设置字符集继承表的,所以一般我们在配置文件中为数据库指定字符集即可

    SHOW CHARACTER SET; -- 查看服务器支持的字符集

    校对规则

      字符集内用于字符比较和排序的一套规则,以_ci结束的为大小写不敏感、_bin结束的为不区分大小写。

      当使用不区分大小写的校对规则时Aa是相同的,否则则不相同,这会影响到排序与比对。

    修改表校对规则,对表的原字段将不影响,只对新增字段影响

    SHOW COLLATION; -- 查看服务器支持的校对规则

    基本定义

       对于字符类型而言,其指定宽度均为存入宽度,以字符为单位。

    create table temp(
            ch char(5) not null, # 最多5个字符
            vc varcha(5) not null # 最多5个字符
    );
    

    定长变长

    区别差异

       char是定长字符串,当存入的字符数量不足指定宽度时,将会使用进行填充。

       varchar是变长字符串,当存入的字符数类不足指定宽度时,不会使用任何字符进行填充。

       通常情况下来讲char的存取速度要比varchar要高(约50%),但是更加浪费磁盘空间

       在InnoDB存储引擎中,不存在这种差异。

    #官网:https://dev.mysql.com/doc/refman/5.7/en/char.html
    #注意:char和varchar括号内的参数指的都是字符的长度
    
    #char类型:定长,简单粗暴,浪费空间,存取速度快
        字符长度范围:0-255(一个中文是一个字符,是utf8编码的3个字节)
        存储:
            存储char类型的值时,会往右填充空格来满足长度
            例如:指定长度为10,存>10个字符则报错,存<10个字符则用空格填充直到凑够10个字符存储
    
        检索:
            在检索或者说查询时,查出的结果会自动删除尾部的空格,除非我们打开pad_char_to_full_length SQL模式(SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';)
    
    #varchar类型:变长,精准,节省空间,存取速度慢
        字符长度范围:0-65535(如果大于21845会提示用其他类型 。mysql行最大限制为65535字节,字符编码为utf-8:https://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html)
        存储:
            varchar类型存储数据的真实内容,不会用空格填充,如果'ab  ',尾部的空格也会被存起来
            强调:varchar类型会在真实数据前加1-2Bytes的前缀,该前缀用来表示真实数据的bytes字节数(1-2Bytes最大表示65535个数字,正好符合mysql对row的最大字节限制,即已经足够使用)
            如果真实的数据<255bytes则需要1Bytes的前缀(1Bytes=8bit 2**8最大表示的数字为255)
            如果真实的数据>255bytes则需要2Bytes的前缀(2Bytes=16bit 2**16最大表示的数字为65535)
        
        检索:
            尾部有空格会保存下来,在检索或者说查询时,也会正常显示包含空格在内的内容
    差异详解
    插入值CHAR(4)存入值CHAR(4)占据空间VARCHAR(4)存入值VARCHAR(4)占据空间
    '' ' ' 4 bytes '' 1 byte
    'ab' 'ab ' 4 bytes 'ab' 3 bytes
    'abcd' 'abcd' 4 bytes 'abcd' 5 bytes
    'abcdefgh' 'abcd' 4 bytes 'abcd' 5 bytes

    由于varchar类型是变长存储,所以需要有一个头部来标识真实内容占了多少字符,这个头部通常占据1个字节。

    即存入abcd的时候算上头部实际上是占用了5个字节。这也是为什么说通常情况下varchar比较节省内存,而不是说全部情况。

    差异对比

       如果要想进定长与变长的差异对比试验,需要用到以下两个函数。

       length():查看字节数

       char_length():查看字符数

    mysql> SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';  # 必须修改模式,使其查看定长字符类型时不会将填充空格移除。
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    
    mysql> create table ch(  # 创建定长字符类型的数据表,最大字符数为5字符
        ->         name char(5) not null
        -> );
    Query OK, 0 rows affected (0.05 sec)
    
    mysql> create table vc(  # 创建变长字符类型的数据表,最大字符数为5字符
        ->         name varchar(5) not null
        -> );
    Query OK, 0 rows affected (0.03 sec)
    
    mysql> insert into  ch(name) values("ab");  # 插入2字符的数据
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select char_length(name) from ch;  # 可以看到这里的字符数为5,默认填充了3个空白字符
    +-------------------+
    | char_length(name) |
    +-------------------+
    |                 5 |
    +-------------------+
    1 row in set (0.00 sec)
    
    mysql> insert into  vc(name) values("ab");  # 插入2字符的数据
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select char_length(name) from vc;  # 字符数量依旧为2字符
    +-------------------+
    | char_length(name) |
    +-------------------+
    |                 2 |
    +-------------------+
    1 row in set (0.00 sec)
    
    mysql>
    
    

       小总结:建议在同一张数据表中统一使用varcharchar类型,这里更推荐使用char类型。

    常用函数

    大小写转换

       upper()小写转大写,lower()大写转小写

    mysql> select upper("mysql"),lower("MYSQL");
    +----------------+----------------+
    | upper("mysql") | lower("MYSQL") |
    +----------------+----------------+
    | MYSQL          | mysql          |
    +----------------+----------------+
    1 row in set (0.00 sec)
    
    mysql>
    

    指定量取

       left()right()函数用于取左或右指定数量的字符

       以下将示例取左边3个字符。

    mysql> select left("一二三四五",3);
    +----------------------+
    | left("一二三四五",3) |
    +----------------------+
    | 一二三               |
    +----------------------+
    1 row in set (0.00 sec)
    
    mysql>
    

    中间字符

       mid()从中间取字符串,参数二为指定起始位置(从1开始),参数三为取的字符数量(可不指定,一直取完)。

       以下将演示从第二个字符开始取两个。

    mysql> select mid("一二三四五",2,2);
    +-----------------------+
    | mid("一二三四五",2,2) |
    +-----------------------+
    | 二三                  |
    +-----------------------+
    1 row in set (0.00 sec)
    
    mysql>
    

    截取子串

       substring()从指定起始位置开始取出向右所有字符串,可指定结束位置。(其实我感觉这个和mid()好像没啥区别)

    mysql> select substring("一二三四五六七八九",1,4);
    +-------------------------------------+
    | substring("一二三四五六七八九",1,4) |
    +-------------------------------------+
    | 一二三四                            |
    +-------------------------------------+
    1 row in set (0.00 sec)
    
    mysql>
    

    字符长度

       char_length()可获取字符长度,如果要获取char类型的字符长度且包括填充空白符,需要修改sql模式。

       修改sql模式:SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';

    mysql> select char_length("一二三四五六七八九");
    +-----------------------------------+
    | char_length("一二三四五六七八九") |
    +-----------------------------------+
    |                                 9 |
    +-----------------------------------+
    1 row in set (0.00 sec)
    
    mysql>
    

    字节长度

       length()可获取字节长度。

    mysql> select length("一二三四五六七八九");
    +------------------------------+
    | length("一二三四五六七八九") |
    +------------------------------+
    |                           18 |
    +------------------------------+
    1 row in set (0.00 sec)
    
    mysql>
    

    字符连接

       concat()可将多段字符进行连接。

       以下示例将展示一二三四五---以及12345这三段字符的连接。

    mysql> select concat("一二三四五","---","12345");
    +------------------------------------+
    | concat("一二三四五","---","12345") |
    +------------------------------------+
    | 一二三四五---12345                 |
    +------------------------------------+
    1 row in set (0.00 sec)
    
    mysql>
    
  • 相关阅读:
    MySQL:解决脏读问题
    MySQL:隔离性问题(脏读)&回滚演示
    MySQL: Mysql 事务隔离级别
    MySQL:数据库事务
    GRE Vocabulary:sedulous
    MySQL:SQL约束
    GRE Vocabulary:pall
    MySQL:DQL操作单表
    MySQL: DQL 查询表中数据
    MySQL:DML操作 表中数据
  • 原文地址:https://www.cnblogs.com/Yunya-Cnblogs/p/13585668.html
Copyright © 2011-2022 走看看