• mysql 字符串类型 char varchar


     字符类型用在存储名字、邮箱地址、家庭住址等描述性数据

     

    char指的是定长字符,varchar指的是变长字符

    #官网: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) 检索: 尾部有空格会保存下来,在检索或者说查询时,也会正常显示包含空格在内的内容

    创建两张表

    只有整型类型的宽度是显示宽度,其他类型的宽度都是存储宽度

     宽度指的是字符的个数

    mysql> create table t13(name char(5));
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> create table t14(name varchar(5));
    Query OK, 0 rows affected (0.01 sec)

     

    char就是定长,不够5个字符,会补全到5个字符,补全相应的空格,由空格作为占位符,凑够5个空格。

    varchar就是变长,传几个字符,就存几个。

    插入数据

    mysql> insert into t13 values('李刚 '); #'李刚        '
    Query OK, 1 row affected (0.00 sec)
    
    mysql> insert into t14 values('李刚 '); #'李刚 '
    Query OK, 1 row affected (0.00 sec)

    查询表,看不到效果

    mysql> select name from t13; #
    +--------+
    | name   |
    +--------+
    | 李刚   |
    +--------+
    1 row in set (0.00 sec)
    
    mysql> select name from t14; #
    +---------+
    | name    |
    +---------+
    | 李刚    |
    +---------+
    1 row in set (0.00 sec

     mysql函数

    length:查看字节数
    char_length:查看字符数

    char类型 存的是5个 查的是2个

    mysql 在存char类型时候 ,会自动补全空格存进来, 取的时候把默认的空格去掉

    mysql> select char_length(name) from t13; # 
    +-------------------+
    | char_length(name) |
    +-------------------+
    |                 2 |
    +-------------------+
    1 row in set (0.00 sec)

    varchar 存的是5个 查的是3个

    
    
    mysql> select char_length(name) from t14; #
    +-------------------+
    | char_length(name) |
    +-------------------+
    |                 3 |
    +-------------------+
    1 row in set (0.00 sec)

    char填充空格来满足固定长度,但是在查询时却会很不要脸地删除尾部的空格(装作自己好像没有浪费过空间一样),然后修改sql_mode让其现出原形

    #略施小计,让char现出原形,设置sql模式,
    mysql> SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';

    出现原形

    mysql> select char_length(name) from t13;
    +-------------------+
    | char_length(name) |
    +-------------------+
    |                 5 |
    +-------------------+
    1 row in set (0.00 sec)
    对于char 和varchar来说 不管怎么存 取得时候mysql只会对值进行比较 不会管末尾的空格,末尾空格没有意义

    只是末尾空格
    验证
    mysql> select name from t13 where name='李刚        ';
    +-----------+
    | name      |
    +-----------+
    | 李刚      |
    +-----------+
    1 row in set (0.00 sec)
    
    mysql> select name from t13 where name='李刚';
    +-----------+
    | name      |
    +-----------+
    | 李刚      |
    +-----------+
    
    
    
    开头 、中间有空格 都查询不到
    mysql> select name from t13 where name=' 李刚';
    Empty set (0.00 sec)
    
    mysql> select name from t13 where name='李 刚';
    Empty set (0.00 sec)
    
    
    

    用模糊查询 like,用like mysql就不会把末尾空格去掉。

    精确的输入 

    
    
    mysql> select name from t13 where name like '李刚  ';
    Empty set (0.00 sec)
    
    mysql> select name from t13 where name like '李刚       ';
    Empty set (0.00 sec)
    
     # 后面补全三个空格可以查询出来
    mysql> select name from t13 where name like '李刚   ';
    +-----------+
    | name      |
    +-----------+
    | 李杰      |
    +-----------+
    1 row in set (0.00 sec)
    
    
    

    #常用字符串系列:char与varchar
    注:虽然varchar使用起来较为灵活,但是从整个系统的性能角度来说,char数据类型的处理速度更快,有时甚至可以超出varchar处理速度的50%。
    因此,用户在设计数据库时应当综合考虑各方面的因素,以求达到最佳的平衡

    
    

    大部分场景用char类型

    
    

    建议
    一张表里 不要char varchar混着用 ,要么全用char类型,要么全用varchar类型

     



  • 相关阅读:
    用Html+Js实现的“自动补全”功能
    利用js为table添加行
    Flex 当鼠标悬停在DataGrid某行上时用datatoolField显示当前行
    Flex中设置编译器参数
    Linux2 在Linux(CentOS)上配置SSH免登陆
    线程笔记
    I/O
    网络编程
    Linux基础
    进程间的通信
  • 原文地址:https://www.cnblogs.com/mingerlcm/p/9799813.html
Copyright © 2020-2023  润新知