字符类型用在存储名字、邮箱地址、家庭住址等描述性数据
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类型