char mysql_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)

检索:

尾部有空格会保存下来,在检索或者说查询时,也会正常显示包含空格在内的内容

bdaf1d641d38cc2d61d28d519e8323c2.png

创建两张表

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

宽度指的是字符的个数

mysql> create table t13(name char(5));

Query OK,0 rows affected (0.02sec)

mysql> create table t14(name varchar(5));

Query OK,0 rows affected (0.01sec)

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

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

插入数据

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

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

查询表,看不到效果

mysql> select name fromt13; #+--------+

| name |

+--------+

| 李刚 |

+--------+

1 row in set (0.00sec)

mysql> select name fromt14; #+---------+

| name |

+---------+

| 李刚 |

+---------+

1 row in set (0.00 sec

mysql函数

length:查看字节数

char_length:查看字符数

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

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

mysql> select char_length(name) fromt13; #+-------------------+

| char_length(name) |

+-------------------+

| 2 |

+-------------------+

1 row in set (0.00 sec)

varchar 存的是5个 查的是3个

mysql> select char_length(name) fromt14; #+-------------------+

| 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) fromt13;+-------------------+

| 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.00sec)

mysql> select name from t13 where name='李刚';+-----------+

| name |

+-----------+

| 李刚 |

+-----------+

开头 、中间有空格 都查询不到

mysql> select name from t13 where name='李刚';

Emptyset (0.00sec)

mysql> select name from t13 where name='李 刚';

Emptyset (0.00 sec)

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

精确的输入

mysql> select name from t13 where name like '李刚';

Emptyset (0.00sec)mysql> select name from t13 where name like '李刚';

Emptyset (0.00sec)# 后面补全三个空格可以查询出来

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值