前言:

前面写过一篇介绍int类型的文章,一直想写一篇介绍字符串字段类型的文章,一直拖着也没思路要怎么下手。最近多关注了下这方面的文章,决定还是把拖了好久的文章了结了吧。本篇文章主要会介绍字符串类型char及varchar的用法及区别。

本文实验环境为MySQL 5.7.23版本,存储引擎为Innodb,sql_mode采用严格模式,字符集是utf8。

▍1.CHAR类型介绍

我们平时使用char类型定义字段时,往往会指定其长度M,即char(M)。其实M指的是字符数,即这个字段最多存储多少个字符,M可不指定,默认为1,范围是[0,255],单个字母、数字、中文等都是占用一个字符。utf8字符集下一个中文字符占用3个字节。下面我们简单测试下:

# 假设以如下建表语句创建测试表

CREATE TABLE `char_tb1` (

`col1` char DEFAULT NULL,

`col2` char(5) DEFAULT NULL,

`col3` char(10) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

# 进入数据库查询建表语句如下 发现char(M) M可不指定,默认为1

mysql> show create table char_tb1\G

*************************** 1. row ***************************

Table: char_tb1

Create Table: CREATE TABLE `char_tb1` (

`col1` char(1) DEFAULT NULL,

`col2` char(5) DEFAULT NULL,

`col3` char(10) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8

1 row in set (0.00 sec)

# 插入数据 可以看出M表示保存的最大字符数,字母、数字、中文等都是占用一个字符

mysql> insert into char_tb1 (col1) values ('a'),('1'),('王'),(']');

Query OK, 4 rows affected (0.01 sec)

mysql> insert into char_tb1 (col1) values ('aa'),('12');

ERROR 1406 (22001): Data too long for column 'col1' at row 1

mysql> select * from char_tb1;

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

| col1 | col2 | col3 |

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

| a | NULL | NULL |

| 1 | NULL | NULL |

| 王 | NULL | NULL |

| ] | NULL | NULL |

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

4 rows in set (0.00 sec)

mysql> insert into char_tb1 (col2) values ('abcd'),('王-123'),('^*123'),('12'),('一二三四五');

Query OK, 5 rows affected (0.01 sec)

mysql> insert into char_tb1 (col2) values ('abcdef');

ERROR 1406 (22001): Data too long for column 'col2' at row 1

mysql> select * from char_tb1;

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

| col1 | col2 | col3 |

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

| a | NULL | NULL |

| 1 | NULL | NULL |

| 王 | NULL | NULL |

| ] | NULL | NULL |

| NULL | abcd | NULL |

| NULL | 王-123 | NULL |

| NULL | ^*123 | NULL |

| NULL | 12 | NULL |

| NULL | 一二三四五 | NULL |

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

9 rows in set (0.00 sec)

# 下面测试发现M的范围是[0,255]

mysql> alter table char_tb1 add column col4 char(0);

Query OK, 0 rows affected (0.10 sec)

Records: 0 Duplicates: 0 Warnings: 0

mysql> alter table char_tb1 add column col5 char(255);

Query OK, 0 rows affected (0.11 sec)

Records: 0 Duplicates: 0 Warnings: 0

mysql> alter table char_tb1 add column col5 char(256);

ERROR 1074 (42000): Column length too big for column 'col5' (max = 255); use BLOB or TEXT instead

▍2.VARCHAR类型介绍

同样的,varchar(M)中的的M表示保存的最大字符数,单个字母、数字、中文等都是占用一个字符。varchar可存储的长度范围为0-65535字节,此外,varchar需要使用1或者2个额外字节记录字符串的长度:如果列的最大长度小于或等于255字节,则只使用1个字节表示,否则使用2个字节。对于Innodb引擎,utf8字符集来说,单个中文字符占用3个字节,所以varchar(M)中的M最大不会超过21845,即M的范围是[0,21845),并且M必须指定。另外MySQL规定:单个字段长度不大于65535字节;单行最大限制为65535,这里不包括TEXT、BLOB字段。即单张表中的所有varchar字段定义的长度之和不能大于65535,所以并不是所有varchar(M)字段中的M都可以取到21844,下面我们来验证下:

# 假设以如下建表语句创建测试表

CREATE TABLE `varchar_tb1` (

`col1` varchar(0) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

# 查看建表语句 增加字段 发现M必须指定

mysql> show create table varchar_tb1\G

*************************** 1. row ***************************

Table: varchar_tb1

Create Table: CREATE TABLE `varchar_tb1` (

`col1` varchar(0) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8

1 row in set (0.00 sec)

mysql> alter table varchar_tb1 add column col2 varchar;

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

# 下面测试证明M最大可取到21844

mysql> CREATE TABLE `varchar_tb2` (col1 varchar(21844));

Query OK, 0 rows affected (0.04 sec)

mysql> CREATE TABLE `varchar_tb3` (col1 varchar(218445));

ERROR 1074 (42000): Column length too big for column 'col1' (max = 21845); use BLOB or TEXT instead

# 下面测试证明单行最大限制为65535字节

mysql> CREATE TABLE `varchar_tb3` (col1 varchar(10));

Query OK, 0 rows affected (0.04 sec)

mysql> alter table varchar_tb3 add column col2 varchar(21844);

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

mysql> alter table varchar_tb3 add column col2 varchar(21834);

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

mysql> alter table varchar_tb3 add column col2 varchar(21833);

Query OK, 0 rows affected (0.09 sec)

Records: 0 Duplicates: 0 Warnings: 0

mysql> show create table varchar_tb3\G

*************************** 1. row ***************************

Table: varchar_tb3

Create Table: CREATE TABLE `varchar_tb3` (

`col1` varchar(10) DEFAULT NULL,

`col2` varchar(21833) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8

1 row in set (0.00 sec)

▍3.CHAR与VARCHAR比较

CHAR类型是定长的,MySQL总是根据定义的字符串长度分配足够的空间。当保存CHAR值时,在它们的右边填充空格以达到指定的长度,当检索到CHAR值时,尾部的空格被删除掉。

VARCHAR类型用于存储可变长字符串,存储时,如果字符没有达到定义的位数,也不会在后面补空格。但是,由于行是变长的,在UPDATE时可能使行变得比原来更长,这就导致需要做额外的工作。如果一个行占用的空间增长,并且在页内没有更多的空间可以存储,在这种情况下InnoDB需要分裂页来使行可以放进页内,这样会增加碎片。

下面简单总结下CHAR与VARCHAR字段类型的适用场景:

CHAR适合存储很短的字符串,或者所有值都接近同一个长度。例如,CHAR非常适合存储密码的MD5值,因为这是一个定长的值。对于经常变更的数据,CHAR也比VARCHAR更好,因为定长的CHAR类型不容易产生碎片。对于非常短的列,CHAR比VARCHAR在存储空间上也更有效率。例如用CHAR(1)来存储只有Y和N的值,如果采用单字节字符集只需要一个字节,但是VARCHAR(1)却需要两个字节,因为还有一个记录长度的额外字节。

下面这些情况下使用VARCHAR是合适的:字符串很长或者所要存储的字符串长短不一,差别很大;字符串列的最大长度比平均长度大得多;列的更新很少,所以碎片不是问题。

额外说明下,我们在定义字段最大长度时应该按需分配,提前做好预估。特别是对于VARCHAR字段,有人认为反正VARCHAR数据类型是根据实际的需要来分配长度的,还不如给大一点呢。但事实不是这样的,比如现在需要存储一个地址信息,根据评估,只要使用100个字符就可以了,我们可以使用VARCHAR(100)或VARCHAR(200)来存储,虽然它们用来存储90个字符的数据,其存储空间相同,但是对于内存的消耗是不同的。更长的列会消耗更多的内存,因为MySQL通常会分配固定大小的内存块来保存内部值,尤其是使用内存临时表进行排列或者操作时会特别糟糕。所以我们在分配VARCHAR数据类型时仍然不能够太过于慷慨。还是要评估实际需要的长度,然后选择一个最长的字段来设置字符长度。如果为了考虑冗余,可以留10%左右的字符长度。千万不能认为VARCHAR是根据实际长度来分配存储空间,而随意的分配长度,或者说干脆使用最大的字符长度。

总结:

本文分别介绍了CHAR与VARCHAR字段类型的使用方法,并且给出了二者的对比以及适用场景。在实际生产情况,需要具体情况具体分析,合适的才是最好的,希望这篇文章能给到大家参考。

mysql varchar255 知乎_CHAR与VARCHAR详解相关推荐

  1. mysql varchar类型实例_Mysql实例MySQL数据类型varchar详解

    <Mysql实例MySQL数据类型varchar详解>要点: 本文介绍了Mysql实例MySQL数据类型varchar详解,希望对您有用.如果有疑问,可以联系我们.1.varchar(N) ...

  2. mysql varchar()_MySQL数据类型varchar详解

    MySQL数据类型varchar详解 更新时间:2014年03月17日 11:10:11   作者: 这篇文章详细介绍了MySQL数据类型varchar,探讨varchar到底能存多长的数据.Inno ...

  3. MySQL数据库增删改查常用语句详解

    MySQL数据库增删改查常用语句详解 一 MySQL数据库表结构 1.1 常见数据类型 1.2 常用约束类型 1.3 MySQL存储引擎 二 DDL语句:数据定义语句 2.1 修改数据库密码 2.1. ...

  4. MySQL批量入库的几种方式详解

    MySQL批量入库的几种方式详解 1. MySQL批量入库概述 2. Hutool封装jdbc方式 3. Jdbc直接或批量执行方式 4. MyBatis批量入库方式 5. MySQL批量入库总结 1 ...

  5. MySQL常用操作之创建存储过程语法详解

    MySQL常用操作之创建存储过程语法详解 前言 简介 语法 创建结构 变量结构 入参变量和出参变量 流程控制 判断(IF 语句) 判断(CASE 语句) 循环(LOOP 语句) 循环(WHILE 语句 ...

  6. Mysql高手系列 - 第8篇:详解排序和分页(order by limit),及存在的坑

    这是Mysql系列第8篇. 环境:mysql5.7.25,cmd命令中进行演示. 代码中被[]包含的表示可选,|符号分开的表示可选其一. 本章内容 详解排序查询 详解limit limit存在的坑 分 ...

  7. jdbc mysql 自动重连_JDBC实现Mysql自动重连机制的方法详解

    JDBC是Java程序连接和访问各种数据库的API,它可以提供Java程序和各种数据库之间的连接服务,下面是爱站技术频道小编为大家带来的JDBC实现Mysql自动重连机制的方法详解. 日志:using ...

  8. mysql主从同步默认延迟_减少mysql主从数据同步延迟问题的详解

    基于局域网的master/slave机制在通常情况下已经可以满足'实时'备份的要求了.如果延迟比较大,就先确认以下几个因素: 1. 网络延迟 2. master负载 3. slave负载 一般的做法是 ...

  9. mysql8.0.20 64位安装教程_windows 64位下MySQL 8.0.15安装教程图文详解

    先去官网下载点击的MySQL的下载 下载完成后解压 解压完是这个样子 配置系统环境变量 复制解压后的mysql到C盘或者其他磁盘下 我们去系统的环境变量的path里添加一个mysql的配置  指向my ...

  10. mysql weekofmonth_深入mysql YEAR() MONTH() DAYOFMONTH()日期函数的详解

    深入mysql YEAR() MONTH() DAYOFMONTH()日期函数的详解 mysql的日期函数. 例子中当前日期:curdate() 是2013年6月24日. YEAR() :显示年mys ...

最新文章

  1. JDK5中的控制台输入
  2. LeetCode-剑指 Offer 04. 二维数组中的查找
  3. angular 指令渲染_Angularjs渲染的 using 指令的星级评分系统示例
  4. 【转】Android:ListView常见错位之CheckBox错位
  5. 部署LAMP-mysql 安装
  6. sas university edition在ubuntu中的使用
  7. 数据结构之链式栈的一些基本操作
  8. python可见图算法_基于自适应显着性的图像分割(源码开放)
  9. EPPlus.Core 1.5.4 报错 font '?' cannot be found docker core运行时2.1.0 alpine镜像 缺失微软字体...
  10. Java从入门到入土
  11. 开发一个app多少钱?app开发费用明细、app开发成本计算
  12. 大二面试bat ,阿里巴巴面试经历,普通本科(二本)
  13. matlab中组合数函数,MATLAB中常用的排列、组合、阶乘函数
  14. Python中的enumerate用法
  15. 用百度ai的人流量统计(动态版)来统计固定场景的人流
  16. 浅谈数码相机成像中 ISO(感光度)的作用
  17. 交互式多模型 IMM的原理
  18. 网络技术这十个术语你知道吗?
  19. 2022-2028全球与中国儿童注意力缺陷和多动障碍市场现状及未来发展趋势
  20. php创建一个猫咪,html5的应用-画一个可爱的小猫咪效果图

热门文章

  1. /proc/sysrq-trigger的使用
  2. 利用JDBC开发图书管理系统
  3. go home(2)-supprise
  4. [转]虚函数实现原理
  5. RocketMQ学习-概览
  6. EnglishWords——星期与月份
  7. Zookeeper动态更新服务器列表
  8. nginx 启动、重启、关闭
  9. xmind 使用备忘
  10. Amoeba 实现Mysql的读写分离