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

 

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

 

mysql 字符串类型 char varchar的更多相关文章

  1. mysql列类型char,varchar,text,tinytext,mediumtext,longtext的比较与选择

    储存不区分大小写的字符数据 TINYTEXT 最大长度是 255 (2^8 – 1) 个字符. TEXT 最大长度是 65535 (2^16 – 1) 个字符. MEDIUMTEXT 最大长度是 16 ...

  2. MySQL——字符串类型——char(n) 和 varchar(n)

    MySQL 的 char(n) 和 varchar(n) 括号中 n 代表字符的个数,而非字节个数,这里说的字符不论文字种类,假设一个字段的数据类型被规定为 char(2),则可以在这个字段上插入 ' ...

  3. mysql字符串类型(char,varchar)

    原文链接:https://blog.csdn.net/puqutogether/article/details/45648879 MySQL中的字符串有两个常用的类型:char和varchar,二者各 ...

  4. MySQL字符串类型转换时间类型

    如果MySQL数据库里面的某个时间用的是varchar(或者是char)类型的,这样可以方便系统使用而不用随便转换时间类型来适应数据库版本的不同,当要把取出的字段转换成时间类型的时候,可以按如下方法操 ...

  5. mysql字符串类型数据

    字符串类型是在数据库中存储字符串的数据类型,字符串类型包括char,varchar,text,enum和set. OK,我们来一个一个的看下上面提到的几种类型. char类型和varchar类型 ch ...

  6. 学习笔记:MySQL字符串类型

    字符串类型 a)         char和varchar 1.都需要指定字符的长度,char中的长度是字符的长度,而varchar的长度是字节的长度 2. char中指定的长度就是实际占用的长度,而 ...

  7. MySQL字符串类型

    VARCHAR类型用于存储变长字符串,它会删除末尾的所有空格,它比定长字符串更省空间,因为它仅使用必要的空间(越短的字符串占用越少),VARCHAR会用1或2个额外字节记录字符串长度(如果字符串长度不 ...

  8. mysql中字符串类型char(n)和varchar(n)的区别

    n的含义 根据网络上找到的结果(不能保证准确),在5.0.3以后版本中,n均代表字符数,而不是字节数:我用来测试的版本是5.7.20,该版本中,n表示字符数. 验证过程如下 建表 CREATE TAB ...

  9. mysql字符串类型(set类型)

    集合 set  不定想项选 类似于 enum枚举,在定义时,也需要指定其已有值! 与字符串相比,优势是: 1, 也是采用 整数进行管理的!采用位运算,从第一位开始为1,逐一x2! 2, 每个集合类型8 ...

随机推荐

  1. linux系统抓包命令

    IP地址抓包:tcpdump -i any host 1.1.1.2 -n 端口抓包: tcpdump -i any port 6789 -n wireshak工具抓包:tcp.port == 678 ...

  2. 124、@JavascriptInterface

    targetSdkVersion 是设置希望的SDK版本,如果设置了此属性,那么在程序执行时,如果目标设备的API版本正好等于此数值,他会告诉Android平台:此程序在此版本已经经过充分测,没有问题 ...

  3. 《转载》图解Tomcat类加载机制

    本文转载自http://www.cnblogs.com/xing901022/p/4574961.html 说到本篇的tomcat类加载机制,不得不说翻译学习tomcat的初衷. 之前实习的时候学习j ...

  4. Failure to transfer org.springframework.boot:spring-boot-starter-parent:pom:2.0.1.RELEASE from https://repo.maven.apache.org/maven2 was cached in the local repository, resolution will not be reattempt

    第一次用 Spring Starter Project 创建一个Spring应用时,POM 文件报错: Project build error: Non-resolvable parent POM f ...

  5. smarty 双引号中嵌入变量的方法

    1.如果变量中只包含字符.数字.下划线,可以将变量直接写在双引号中,如:"my name is $name" 2.如果带有其它字符,如“.”,则需要将变量用单引号括起来,如:“my ...

  6. sencha touch list 批量选择扩展(2013-7-29)

    扩展js代码 /* *list多选扩展 */ Ext.define('ux.SimpleList', { alternateClassName: 'simpleList', extend: 'Ext. ...

  7. jconsole连接远程Tomcat应用

    一.环境信息 远程tomcat:linux 64位 centos 7 上tomcat 8 本机:windows7 二.步骤 linux上,在tomcat安装目录的bin下,新建setenv.sh,内容 ...

  8. [Offer收割]编程练习赛15 B.分数调查[加权并查集]

    #1515 : 分数调查 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi的学校总共有N名学生,编号1-N.学校刚刚进行了一场全校的古诗文水平测验. 学校没有公布测 ...

  9. 【CF850E】Random Elections FWT

    [CF850E]Random Elections 题意:有n位选民和3位预选者A,B,C,每个选民的投票方案可能是ABC,ACB,BAC...,即一个A,B,C的排列.现在进行三次比较,A-B,B-C ...

  10. Android 使用MediaPlayer 播放 视频

    http://pan.baidu.com/s/1lgKLS package cn.bgxt.surfaceviewdemo; import java.io.File; import android.m ...