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类型

 



原文地址:https://www.cnblogs.com/mingerlcm/p/9799813.html